In der ersten Tabelle habe ich Bestellungen. In der zweiten - Nachrichten, die an diese Aufträge senden. Ich muss Datum und Status von der letzten Nachricht erhalten (oder NULL, wenn Nachrichten noch nicht gesendet haben) für jeden Auftrag, der aktiv = 1 ist. Die Tabellen, die mit dem zusammengesetzten Schlüssel verbunden sind - "order_id + offer".Holen Sie sich das letzte Element in jeder Gruppe MySql
"orders" -Tabelle:
+----------+----------+--------+----------+
| order_id | offer | active | timezone |
+----------+----------+--------+----------+
| 6 | kopiya | 1 | 0 |
| 6 | kopiya-3 | 1 | 0 |
| 10 | kopiya | 1 | 180 |
| 23 | kopiya-2 | 1 | 0 |
| 27 | kopiya-2 | 0 | 0 |
+----------+----------+--------+----------+
"sms" Tabelle:
+------+----------+----------+------+--------+---------------------+
| key_ | order_id | offer | type | status | date |
+------+----------+----------+------+--------+---------------------+
| 1 | 6 | kopiya | text | 1 | 2016-06-20 00:00:00 |
| 2 | 6 | kopiya-3 | text | 0 | 2016-06-21 00:00:00 |
| 3 | 10 | kopiya | text | 0 | 2016-06-27 00:00:00 |
| 4 | 27 | kopiya-2 | text | 1 | 2016-06-21 00:00:00 |
| 6 | 6 | kopiya-3 | text | 1 | 2016-06-23 00:00:00 |
+------+----------+----------+------+--------+---------------------+
Das Ergebnis wird sein:
+----------+----------+---------------------+--------+
| order_id | offer | last_date | status |
+----------+----------+---------------------+--------+
| 6 | kopiya | 2016-06-20 00:00:00 | 1 |
| 6 | kopiya-3 | 2016-06-23 00:00:00 | 1 |
| 10 | kopiya | 2016-06-27 00:00:00 | 0 |
| 23 | kopiya-2 | NULL | NULL |
+----------+----------+---------------------+--------+
Diese Abfrage funktioniert nicht richtig:
SELECT o.order_id, o.offer, max(date) as last_date, status
FROM orders AS o
LEFT JOIN sms AS s
ON o.order_id=s.order_id AND o.offer=s.offer
WHERE `active` = 1
GROUP BY o.order_id, o.offer;
Es zeigt:
+----------+----------+---------------------+--------+
| order_id | offer | last_date | status |
+----------+----------+---------------------+--------+
| 6 | kopiya | 2016-06-20 00:00:00 | 1 |
| 6 | kopiya-3 | 2016-06-23 00:00:00 | 0 |
| 10 | kopiya | 2016-06-27 00:00:00 | 0 |
| 23 | kopiya-2 | NULL | NULL |
+----------+----------+---------------------+--------+
Für Taste „6 kopiya-3“ es Status zurückgeben = 0, aber 1 erwartet, weil er diesen Wert aus der ersten Reihe bekommen, anstatt mit max Datum rudern. Wie kann ich das beheben?
Nein, es scheint, dass Sie mich um ein paar Minuten zu schlagen. Ein Hinweis zu dieser Frage: Wenn Sie 'y' an' order_id', 'offer' und' date' anfügen, ist eine Zeile nicht garantiert. Es könnte theoretisch> 1 Zeilen mit den gleichen Werten geben diese Felder, in diesem Fall werden Sie mit Duplikaten enden. Wenn Sie 'MAX (date)' verwenden möchten, benötigen Sie wahrscheinlich noch eine weitere Unterauswahl, um das 'MAX (key_)' zu erhalten (oder wie auch immer Sie die "letzte" Zeile identifizieren würden, die Sie zurückgeben möchten). –
Ja. Ich nehme ein PK auf '(order_id, offer)' an. – Strawberry
Entschuldigung, ich verstehe das nicht wirklich. – Strawberry