J'ai lu de nombreux threads sur l'obtention uniquement de la première ligne d'une jointure gauche, mais, pour une raison quelconque, cela ne fonctionne pas pour moi.
Voici ma structure (simplifiée bien sûr)
Flux
id | title | content
----------------------
1 | Feed 1 | ...
Artistes
artist_id | artist_name
-----------------------
1 | Artist 1
2 | Artist 2
feeds_artists
rel_id | artist_id | feed_id
----------------------------
1 | 1 | 1
2 | 2 | 1
...
Maintenant, je veux obtenir les articles et rejoindre uniquement le premier artiste et j'ai pensé à quelque chose comme ceci:
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'
juste pour obtenir uniquement la première ligne des feeds_artists, mais déjà cela ne fonctionne pas.
Je ne peux pas utiliser à TOP
cause de ma base de données et je ne peux pas regrouper les résultats par feeds_artists.artist_id
car je dois les trier par date (j'ai obtenu des résultats en les regroupant de cette façon, mais les résultats n'étaient pas les plus récents)
J'ai également essayé quelque chose avec OUTER APPLY - pas de succès non plus. Pour être honnête, je ne peux pas vraiment imaginer ce qui se passe dans ces rangées - probablement la principale raison pour laquelle je ne peux pas faire fonctionner cela.
SOLUTION:
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'
Réponses:
Si vous pouvez supposer que les identifiants d'artiste augmentent avec le temps, alors le
MIN(artist_id)
sera le plus ancien.Alors essayez quelque chose comme ça (non testé ...)
la source
Version sans sous-sélection:
la source
La réponse de @Matt Dodges m'a mis sur la bonne voie. Merci encore pour toutes les réponses, qui ont aidé beaucoup de gars dans l'intervalle. Ça marche comme ça:
la source
f.id
condition.J'ai utilisé autre chose (je pense mieux ...) et je veux le partager:
J'ai créé une VIEW qui a une clause "group"
Je veux dire encore, que je pense que nous devons faire cette solution PARCE QUE NOUS AVONS FAIT QUELQUE CHOSE DE FAUX DANS L'ANALYSE ... du moins dans mon cas ... mais parfois c'est moins cher de faire cela que de tout repenser ...
J'espère que ça aide!
la source
country_code
, c'estGROUP BY
inapproprié. VoirONLY_FULL_GROUP_BY
.WITH x AS (
clause?basé sur plusieurs réponses ici, j'ai trouvé quelque chose qui a fonctionné pour moi et je voulais généraliser et expliquer ce qui se passe.
convertir:
à:
la condition qui connecte t1 et t2 est déplacée de
ON
et vers la requête interneWHERE
. laMIN(primary key)
ouLIMIT 1
fait en sorte que seule une ligne est renvoyée par la requête interne.après avoir sélectionné une ligne spécifique, nous devons dire à
ON
quelle ligne il s'agit. c'est pourquoi leON
compare la clé primaire de la table jointe.vous pouvez jouer avec la requête interne (c'est-à-dire ordre + limite) mais elle doit retourner une clé primaire de la ligne souhaitée qui indiquera la
ON
ligne exacte à rejoindre.la source
LIMIT
ou seulementMIN
. laON
condition doit être sur la clé primaire de la table jointe pour éviter un impact sur les performances.Je veux donner une réponse plus générale . Celui qui gérera tous les cas lorsque vous souhaitez sélectionner uniquement le premier élément dans une jointure à gauche .
Vous pouvez utiliser une sous-requête qui GROUP_CONCATS ce que vous voulez (triée aussi!), Puis diviser simplement le résultat de GROUP_CONCAT et ne prendre que son premier élément, comme ceci ...
Puisque nous avons DESC comme option ORDER BY , cela renverra un identifiant de personne pour quelqu'un comme "Zack". Si nous voulions quelqu'un avec le nom comme "Andy", nous changerions ORDER BY FirstName DESC en ORDER BY FirstName ASC .
C'est agile, car cela place le pouvoir de commander totalement entre vos mains. Mais, après de nombreux tests, il ne s'adaptera pas bien dans une situation avec beaucoup d'utilisateurs et beaucoup de données.
Il est cependant utile pour exécuter des rapports gourmands en données pour l'administrateur.
la source
GROUP_CONCAT
astuce est bonne tant que le nombre de valeurs est limité. La limite par défaut est de 1024 caractères.