2011-01-04 3 views
0

J'ai deux tables que j'interroge. Dans une table, il y a des champs qui indiquent si un joueur figurant sur une photo est mort/vivant, dans le Hall of Fame, etc. Le champ que je viens d'ajouter s'appelle "new_flag". Cela indique si la photo est de nouveau à mon inventaireMySQL sélectionnez aide; Sous-requête?

Sans GROUP BY, les résultats ressemblerait à quelque chose comme ça (Notez que certains joueurs ont plus d'un produit/photo)

name   firstname lastname  hall_of_fame deceased new_flag 
----   --------- --------  ------------ -------- -------- 
EARL AVERILL SR EARL  AVERILL SR Y    Y   Y 
BILL TERRY  BILL  TERRY  Y    Y   N 
BILL TERRY  BILL  TERRY  Y    Y   Y 
BILL TERRY  BILL  TERRY  Y    Y   N 
BOBBY DOERR  BOBBY  DOERR  Y    N   N 
BOBBY DOERR  BOBBY  DOERR  Y    N   N 

Avec un GROUP BY ma La requête ressemble à ceci, mais elle ne peut pas toujours trouver le nouveau drapeau puisque chaque joueur peut avoir plus d'un enregistrement.

SELECT CONCAT(a.firstname,' ',a.lastname) AS name, 
      a.firstname, 
      a.lastname, 
      b.hall_of_fame, 
      b.deceased, 
      b.new_flag 
FROM  vm_product_name AS a, 
      vm_product_new_attribute AS b 
WHERE b.hall_of_fame ='Y' 
    AND a.product_id = b.product_id 
GROUP BY CONCAT(a.firstname,' ',a.lastname) 
ORDER BY a.lastname, 
      a.firstname; 

Le problème est que je ne veux que chaque joueur apparaisse une fois sur ma page Web, mais ..... Je veux aussi ajouter une icône « nouveau » à côté du nom du joueur si elles ont au moins 1 nouvelle photo Des idées comment je peux faire ça? Je sais que ce n'est pas la meilleure façon de le faire, mais il est construit comme une extension Joomla/Virtumart et je ne peux pas changer la structure de la base de données pour le moment.

+1

En aparté, vous pouvez regrouper plusieurs colonnes, alors ne pas utiliser le CONCAT dans le groupe par clause, utilisez juste " GROUP BY a.firstname, a.lastname ". La principale raison pour éviter d'utiliser des fonctions dans les clauses GROUP BY (ainsi que WHERE et ORDER BY) est que cela empêchera MySQL d'utiliser un index, et pourrait l'amener à construire une table temporaire qui ralentira considérablement votre requête. –

Répondre

4
SELECT CONCAT(a.firstname, ' ', a.lastname) AS name, a.firstname, a.lastname, 
    b.hall_of_fame, b.deceased, MAX(b.new_flag) AS new_flag 
FROM vm_product_name AS a 
    INNER JOIN vm_product_new_attribute AS b 
     ON a.product_id = b.product_id 
WHERE b.hall_of_fame = 'Y' 
GROUP BY a.lastname, a.firstname 
ORDER BY a.lastname, a.firstname 
+0

+1: Mais, si par exemple il y avait deux rangées d'un même joueur et que le défunt avait deux valeurs différentes, il choisirait arbitrairement l'une des rangées. http://dev.mysql.com/doc/refman/5.5/fr/group-by-hidden-columns.html –

+0

Merci beaucoup! Je pense que ça l'a fait. @nate c Hmm. Y a-t-il un moyen de garder cela à l'écart? – relyt

+1

Le joueur devrait avoir sa propre table sans doublons, mais vous avez dit plus haut que vous n'avez pas de contrôle sur la table. –

-1

vous pouvez rejoindre une gauche à la place ...

SELECT * FROM (
SELECT CONCAT(vm_product_name.firstname, ' ', vm_product_name.lastname) AS name 
vm_product_name.firstname AS firstname, 
vm_product_name.lastname, AS lastname, 
vm_product_new_attribute.hall_of_fame AS hall_of_fame, 
vm_product_new_attribute.deceased AS deceased, 
vm_product_new_attribute.new_flag AS new_flag 
FROM vm_product_name LEFT JOIN vm_product_new_attribute ON vm_product_name.product_id = vm_product_new_attribute.product_id 
ORDER BY lastname, firstname) AS MYRESULT GROUP BY CONCAT(lastname, ' ',firstname); 
+0

Que fait Joindre Joindre? Il n'y a pas de problèmes avec les nulls qui ne se joignent pas. –

+0

Uhh BONJOUR! Que faire si la table B n'a pas de product_id correspondant? il serait exclu ... ** C'est l'utilisateur entier serait exclu ... – CarpeNoctumDC