2017-04-05 13 views
0

Was sollte der beste Weg sein, die folgenden mySQL-Abfragen zusammenzuführen? Sollte es zu komplex werden? Ich möchte die Ergebnisse nach der match_score genau wie in der ersten Abfrage sortieren. Ich habe gehört, dass es eine Union-Option gibt, um mehrere Select-Abfragen zu verbinden, nicht sicher, wie es funktioniert, aber gibt es keine Möglichkeit, die 3 Abfragen unter einer Select-Abfrage zusammenzuführen? Vielen Dank für Ihre Zeit.Wie kann ich diese mySQL-Abfragen zusammenführen

Abfrage 1:

SELECT 
    ui.User_ID, 
    TRUNCATE(COUNT(*)/2, 1) + COUNT(my.interest_id) * 2.5 AS match_score 
FROM 
    User_Interests ui 
     LEFT JOIN 
    User_Interests my ON (my.user_id = ? 
     AND my.interest_id = ui.interest_id) 
GROUP BY ui.user_id 
ORDER BY match_score DESC 

Abfrage 2:

SELECT 
    ud.User_ID, 
    TRUNCATE(COUNT(*)/2, 1) + COUNT(my.dislike_id) * 2.5 AS match_score 
FROM 
    User_Dislikes ud 
     LEFT JOIN 
    User_Dislikes my ON (my.user_id = ? 
     AND my.dislike_id = ud.dislike_id) 
GROUP BY ud.user_id 
ORDER BY match_score DESC 

Abfrage 3:

SELECT 
    u.* 
FROM 
    User u 
     LEFT JOIN 
    User_Status us ON u.id = User_ID1 AND us.User_ID2 = 5 
WHERE 
    gender = ? 
     AND (us.Status != 'FRIENDS' 
     OR us.status IS NULL) 
     AND u.birthday >= DATE(NOW()) - INTERVAL ? YEAR - INTERVAL 1 YEAR 
     AND u.birthday < DATE(NOW()) - INTERVAL ? YEAR 
+0

Was ist der äußere Join in der dritten Abfrage für? Es scheint mir überhaupt keine Wirkung zu haben. Sie finden entweder einen Nicht-Freund-Datensatz für einen Benutzer auf Benutzer 5 oder nicht, aber Sie wählen den Benutzer unabhängig aus. (Ich nehme an, dass User_ID1 + User_ID2 in User_Status eindeutig sind. Andernfalls würde der Join Ergebnisdatensätze duplizieren.) –

+0

Wie User_Status: Der Eintrag User_ID1 = 1, User_ID2 = 5 hat eine andere Bedeutung als User_ID1 = 5, User_ID2 = 1? Oder es ist garantiert, dass für eine Aufzeichnung a | b (z. B. 1 | 5) immer eine Geschwisteraufzeichnung b | a (z. B. 5 | 1) & le; Oder ist keine dieser beiden Aussagen wahr? Wenn letzteres: Möchten Sie nicht auch nach u.id = User_ID2 UND us.User_ID1 = 5 suchen? –

+0

Sie sollten Beispieldaten anzeigen, die von den drei Abfragen zurückgegeben werden, d. H. Einige Zeilen für beispielsweise vier Benutzer, die in einem oder zwei oder drei Ergebnissen vorhanden sind, und das erwartete Ergebnis für die zusammengeführte Abfrage. Da gibt es zwei Punkte: Wonach willst du sortieren? –

Antwort

1

Sie sagen, Sie wollen die Punktzahlen hinzugefügt. Okay. Sie sagen auch, dass Abfrage 3 zum Filtern dient, aber da ein Outer-Join nichts natürlich filtert, ist der einzige Filter Geschlecht und Geburtsdatum. Es scheint jedoch, dass Sie versuchen, auch mit Benutzer 5 nach Nicht-Freunden zu filtern. Ich nehme an, Sie suchen nach etwas wie folgt aus:

select 
    u.*, 
    i.match_score as interests_match_score, 
    d.match_score as dislikes_match_score, 
    coalesce(i.match_score, 0) + coalesce(d.match_score, 0) as total_match_score 
from user u 
left join 
(
    select 
    ui.user_id, 
    truncate(count(*)/2, 1) + count(my.interest_id) * 2.5 as match_score 
    from user_interests ui 
    left join user_interests my on (my.user_id = ? and my.interest_id = ui.interest_id) 
    group by ui.user_id 
) i on i.user_id = u.id 
left join 
(
    select 
    ud.user_id, 
    truncate(count(*)/2, 1) + count(my.dislike_id) * 2.5 as match_score 
    from user_dislikes ud 
    left join user_dislikes my on (my.user_id = ? and my.dislike_id = ud.dislike_id) 
    group by ud.user_id 
) d on d.user_id = u.id 
where id in (select user_id1 from user_status where user_id2 = 5 and status <> 'friends') 
and gender = ? 
and u.birthday >= date(now()) - interval ? year - interval 1 year 
and u.birthday < date(now()) - interval ? year; 

Sie müssen Änderungen vornehmen können, aber diese sollten einfach sein.

+0

Vielen Dank! Das ist, was ich gesucht habe. –

0

Union ist der beste Weg, um mer ge mehrere Abfragen zur gleichen Zeit. Unten ist die Art und Weise es zu tun

SELECT 
    User_ID, 
    TRUNCATE(COUNT(*)/2, 1) + COUNT(interest_id) * 2.5 AS match_score from { 

    SELECT 
    ui.User_ID, 
    TRUNCATE(COUNT(*)/2, 1) + COUNT(my.interest_id) * 2.5 AS match_score 
FROM 
    User_Interests ui 
     LEFT JOIN 
    User_Interests my ON (my.user_id = ? 
     AND my.interest_id = ui.interest_id) 

     union 

     SELECT 
    ud.User_ID, 
    TRUNCATE(COUNT(*)/2, 1) + COUNT(my.dislike_id) * 2.5 AS match_score 
FROM 
    User_Dislikes ud 
     LEFT JOIN 
    User_Dislikes my ON (my.user_id = ? 
     AND my.dislike_id = ud.dislike_id) 

     union 


     SELECT 
    ud.User_ID, 
    TRUNCATE(COUNT(*)/2, 1) + COUNT(my.dislike_id) * 2.5 AS match_score 
FROM 
    User u 
     LEFT JOIN 
    User_Status us ON u.id = User_ID1 AND us.User_ID2 = 5 
WHERE 
    gender = ? 
     AND (us.Status != 'FRIENDS' 
     OR us.status IS NULL) 
     AND u.birthday >= DATE(NOW()) - INTERVAL ? YEAR - INTERVAL 1 YEAR 
     AND u.birthday < DATE(NOW()) - INTERVAL ? YEAR 

} results 

GROUP BY User_ID 
ORDER BY match_score DESC 
+0

Im Moment gibt es 3 Fehler, die ich bekomme. 1 in Zeile 5 sagt unerwartete Auswahl. Eine weitere Zeile in Zeile 12 besagt, dass die geschweiften Klammern fehlen und eine weitere in Zeile 40, in der die fehlenden geschweiften Klammern angegeben sind. –

+0

Ich habe den Code aktualisiert.Bitte überprüfen und entsprechend ändern –

Verwandte Themen