Ich habe viele Threads darüber gelesen, nur die erste Zeile eines linken Joins zu erhalten, aber aus irgendeinem Grund funktioniert dies bei mir nicht.
Hier ist meine Struktur (natürlich vereinfacht)
Einspeisungen
id | title | content
----------------------
1 | Feed 1 | ...
Künstler
artist_id | artist_name
-----------------------
1 | Artist 1
2 | Artist 2
feeds_artists
rel_id | artist_id | feed_id
----------------------------
1 | 1 | 1
2 | 2 | 1
...
Jetzt möchte ich die Artikel bekommen und mich nur dem ersten Künstler anschließen, und ich dachte an so etwas:
SELECT *
FROM feeds
LEFT JOIN feeds_artists ON wp_feeds.id = (
SELECT feeds_artists.feed_id FROM feeds_artists
WHERE feeds_artists.feed_id = feeds.id
LIMIT 1
)
WHERE feeds.id = '13815'
nur um nur die erste Zeile der feeds_artists zu bekommen, aber das funktioniert schon nicht.
Ich kann es TOP
aufgrund meiner Datenbank nicht verwenden und ich kann die Ergebnisse nicht gruppieren, feeds_artists.artist_id
da ich sie nach Datum sortieren muss (ich habe Ergebnisse erhalten, indem ich sie auf diese Weise gruppiert habe, aber die Ergebnisse waren nicht die neuesten).
Versuchte auch etwas mit OUTER APPLY - auch kein Erfolg. Um ehrlich zu sein, kann ich mir nicht wirklich vorstellen, was in diesen Reihen vor sich geht - wahrscheinlich der Hauptgrund, warum ich das nicht zum Laufen bringen kann.
LÖSUNG:
SELECT *
FROM feeds f
LEFT JOIN artists a ON a.artist_id = (
SELECT artist_id
FROM feeds_artists fa
WHERE fa.feed_id = f.id
LIMIT 1
)
WHERE f.id = '13815'
Antworten:
Wenn Sie davon ausgehen können, dass die Künstler-IDs mit der Zeit zunehmen, ist
MIN(artist_id)
dies die früheste.Also versuchen Sie so etwas (ungetestet ...)
quelle
Version ohne Unterauswahl:
quelle
Die Antwort von @Matt Dodges hat mich auf den richtigen Weg gebracht. Nochmals vielen Dank für alle Antworten, die in der Zwischenzeit vielen Leuten geholfen haben. Habe es so gemacht:
quelle
f.id
Bedingung vorliegt.Ich habe etwas anderes verwendet (ich denke besser ...) und möchte es teilen:
Ich habe eine VIEW erstellt, die eine "Gruppen" -Klausel enthält
Ich möchte noch sagen, dass ich denke, dass wir diese Lösung machen müssen, WEIL WIR IN DER ANALYSE ETWAS FALSCHES GEMACHT HABEN ... zumindest in meinem Fall ... aber manchmal ist es billiger, dies zu tun, um alles neu zu gestalten ...
Ich hoffe, es hilft!
quelle
country_code
,GROUP BY
ist das unangemessen. SieheONLY_FULL_GROUP_BY
.WITH x AS (
Klausel verwendet werden?Basierend auf mehreren Antworten hier fand ich etwas, das für mich funktionierte und ich wollte verallgemeinern und erklären, was los ist.
Konvertieren:
zu:
Die Bedingung, die t1 und t2 verbindet, wird von
ON
und in die innere Abfrage verschobenWHERE
. DasMIN(primary key)
oderLIMIT 1
stellt sicher, dass nur 1 Zeile von der inneren Abfrage zurückgegeben wird.Nachdem wir eine bestimmte Zeile ausgewählt haben, müssen wir
ON
der Zeile mitteilen, um welche es sich handelt. Aus diesem GrundON
wird der Primärschlüssel der verknüpften Tabelle verglichen.Sie können mit der inneren Abfrage spielen (dh Reihenfolge + Limit), sie muss jedoch einen Primärschlüssel der gewünschten Zeile zurückgeben, der
ON
die genaue Zeile angibt, der verbunden werden soll.quelle
LIMIT
oder nurMIN
. DieON
Bedingung muss sich auf dem Primärschlüssel der verknüpften Tabelle befinden, um Auswirkungen auf die Leistung zu vermeiden.Ich möchte eine allgemeinere Antwort geben . Eine, die in jedem Fall funktioniert , wenn Sie nur das erste Element in einem LEFT JOIN auswählen möchten .
Sie können eine Unterabfrage verwenden, die GROUP_CONCATS entspricht, was Sie möchten (auch sortiert!), Dann einfach das GROUP_CONCAT-Ergebnis aufteilen und nur das erste Element nehmen, wie folgt ...
Da wir DESC als ORDER BY- Option haben, wird eine Personen-ID für jemanden wie "Zack" zurückgegeben. Wenn wir jemanden mit dem Namen "Andy" wollten, würden wir ORDER BY FirstName DESC in ORDER BY FirstName ASC ändern .
Dies ist flink, da Sie damit die Möglichkeit haben, vollständig zu bestellen. Nach vielen Tests lässt es sich jedoch in einer Situation mit vielen Benutzern und vielen Daten nicht gut skalieren .
Es ist jedoch nützlich, um datenintensive Berichte für den Administrator auszuführen.
quelle
GROUP_CONCAT
Trick ist gut, solange die Anzahl der Werte begrenzt ist. Das Standardlimit beträgt 1024 Zeichen.