Für eine Dating-Anwendung, habe ich ein paar Tabellen, die ich für eine einzelne Ausgabe mit einem LIMIT 10 beider Abfragen kombiniert benötigen. Es scheint im Moment schwierig zu sein, obwohl es kein Problem ist, sie separat abzufragen, aber das LIMIT 10 funktioniert nicht, da die Zahlen nicht exakt sind (zB nicht LIMIT 5 und LIMIT 5, eine Abfrage kann 0 Zeilen zurückgeben , während die anderen 10, abhängig vom Szenario).MySQL - Kombinieren von zwei Select-Anweisungen in einem Ergebnis mit LIMIT effizient
members table
member_id | member_name
------------------------
1 Herb
2 Karen
3 Megan
dating_requests
request_id | member1 | member2 | request_time
----------------------------------------------------
1 1 2 2012-12-21 12:51:45
dating_alerts
alert_id | alerter_id | alertee_id | type | alert_time
-------------------------------------------------------
5 3 2 platonic 2012-12-21 10:25:32
dating_alerts_status
status_id | alert_id | alertee_id | viewed | viewed_time
-----------------------------------------------------------
4 5 2 0 0000-00-00 00:00:00
Stellen Sie Karen sind und gerade angemeldet, sollten Sie diese 2 Artikel sehen:
1. Herb requested a date with you.
2. Megan wants a platonic relationship with you.
In einer Abfrage mit einem Limit von 10 hier Stattdessen sind zwei Abfragen, die kombiniert werden müssen:
1. Herb requested a date with you.
-> query = "SELECT dr.request_id, dr.member1, dr.member2, m.member_name
FROM dating_requests dr
JOIN members m ON dr.member1=m.member_id
WHERE dr.member2=:loggedin_id
ORDER BY dr.request_time LIMIT 5";
2. Megan wants a platonic relationship with you.
-> query = "SELECT da.alert_id, da.alerter_id, da.alertee_id, da.type,
da.alert_time, m.member_name
FROM dating_alerts da
JOIN dating_alerts_status das ON da.alert_id=das.alert_id
AND da.alertee_id=das.alertee_id
JOIN members m ON da.alerter_id=m.member_id
WHERE da.alertee_id=:loggedin_id AND da.type='platonic'
AND das.viewed='0' AND das.viewed_time<da.alert_time
ORDER BY da.alert_time LIMIT 5";
auch hier manchmal beide Tabellen leer sein können, oder 1 Tabelle leer sein kann, oder beide voll ist (wo LIMIT 10 Tritte in) und durch die Zeit geordnet. Irgendwelche Ideen, wie man eine Abfrage erhält, um diese Aufgabe effizient auszuführen? Gedanken, Ratschläge, Glockenspiele, Optimierungen sind willkommen.
Wenn die von den zwei Abfragen zurückgegebenen Spalten identisch sind, verbinden Sie sie mit ['UNION'] (http://dev.mysql.com/doc/refman/5.6/en/union.html) und machen Sie das Ganze eine Unterabfrage an eine äußere Abfrage, die das 'LIMIT' ausführt. Andernfalls können Sie die erforderliche 'LIMIT' für die zweite Abfrage ermitteln (10 minus der Anzahl der von der ersten Abfrage zurückgegebenen Datensätze). Dies ist wahrscheinlich am einfachsten in der Sprache, die Sie zum Aufrufen von Abfragen verwenden. – eggyal
Erstellen Sie eine Tabelle mit Ihren erwarteten Ergebnissen. Sie werden das Problem dort sehen. –
Es ist nicht möglich, 2 Abfragen mit verschiedenen Auswahllisten zu kombinieren. – vyegorov