2011-01-04 17 views
0

Ich habe zwei Tabellen, die ich abfragen. In einer Tabelle gibt es Felder, die anzeigen, ob ein Spieler auf einem Foto tot ist/lebt, in der Hall of Fame, usw. Das Feld, das ich gerade hinzugefügt habe, heißt "new_flag". Dies zeigt, ob das Foto zu meinem InventarMySQL Hilfe auswählen; Unterabfrage?

Ohne GROUP BY neu ist, würden die Ergebnisse wie folgt aussehen (Anmerkung einige Spieler haben mehr als ein Produkt/Foto)

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 

Mit einem GROUP BY mein Abfrage sieht so aus, aber es kann nicht immer die neue Flagge finden, da jeder Spieler mehr als einen Rekord haben kann.

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; 

Das Problem ist, dass ich nur nur jeder Spieler einmal auf meiner Webseite angezeigt werden soll, aber ..... Ich mag auch neben den Namen des Spielers ein „neues“ Symbol hinzufügen, wenn sie zumindest 1 neues Foto. Irgendwelche Ideen, wie ich das machen kann?

Ich weiß, dass dies nicht der optimale Weg ist, aber es ist als Joomla/Virtumart Erweiterung gebaut und ich kann die Datenbankstruktur zu diesem Zeitpunkt nicht ändern.

+1

Als Nebenwirkung, können Sie Gruppe von mehreren Spalten, so verwenden Sie nicht die CONCAT in der Gruppe durch Klausel nur verwenden " GROUP BY ein.vorname, a.lastname ". Der Hauptgrund für die Verwendung von Funktionen in GROUP BY-Klauseln (sowie WHERE- und ORDER BY-Klauseln) besteht darin, dass MySQL keinen Index verwenden kann und möglicherweise eine temporäre Tabelle erstellt, die Ihre Abfrage erheblich verlangsamt. –

Antwort

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: Aber wenn zum Beispiel zwei Reihen eines gleichen Spielers und eines Verstorbenen zwei verschiedene Werte hätten, würde er eine der Reihen willkürlich auswählen. http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html –

+0

Vielen Dank! Ich denke, das hat es getan. @nate c Hmm. Gibt es das überhaupt, um das zu verhindern? – relyt

+1

Spieler sollten ihre eigene Tabelle ohne Duplikate haben, aber Sie haben oben gesagt, dass Sie keine Kontrolle über die Tabelle haben. –

-1

Sie links möchten beitreten statt ...

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

Was bewirkt linker Beitritt? Es gibt keine Probleme mit Nullen, die nicht beitreten. –

+0

Uhh HALLO! Was ist, wenn Tabelle B keine übereinstimmende Produkt-ID hat? es wäre ausgeschlossen ... ** Das wäre der gesamte Benutzer wäre ausgeschlossen ... – CarpeNoctumDC