2011-01-04 18 views
0

私は2つのテーブルを照会しています。 1つのテーブルには、写真に登場するプレーヤーが死んでいるかどうかを示すフィールド、名声の殿堂などがあります。追加したばかりのフィールドは「new_flag」と呼ばれます。この写真はGROUP BYがなければ、私の在庫MySQLのヘルプを選択してください。サブクエリ?

に新しいものであるかどうかを示し、結果は私の、GROUP BYでは、このようなもの(いくつかのプレイヤーが一つの製品/写真以上のものを持って注意してください)

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 

を見てしまいますクエリはこのように見えますが、各プレイヤーは複数のレコードを持つ可能性があるため、常に新しいフラグを見つけることはできません。

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; 

問題は、私はまた、彼らは少なくとも持っている場合は、プレイヤーの名前の横に「新」アイコンを追加したい.....私は唯一の各プレイヤーは自分のWebページ上で一度表示したいということですが、 1枚の新しい写真。どのように私はこれを行うことができます任意のアイデア?

これは最適な方法ではありませんが、Joomla/Virtumart拡張機能として構築されており、現時点ではデータベース構造を変更できません。

+1

さておき、あなたが複数の列でグループができるので、 "ちょうど使用し、GROUP BY句でCONCATを使用していないとして...左が代わりに参加するとよいでしょうGROUP BY a.firstname、a.lastname "と入力します。 GROUP BY(WHERE句とORDER BY句だけでなく)の句を使用しないようにする主な理由は、MySQLがインデックスを使用できなくなり、一時的なテーブルを作成してクエリを大幅に遅くする可能性があるためです。 –

答えて

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:しかし、例えば同じプレイヤーの2つの行があり、故人が2つの異なる値を持っていたとすると、行のうちの1つを任意に選ぶでしょう。 http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html –

+0

ありがとうございました!私はこれがそれをしたと思います。 @nate c Hmm。これを起こさないようにとにかくありますか? – relyt

+1

プレーヤーは重複することなく自分のテーブルを持っているべきですが、あなたはあなたが上記のテーブルを支配していないと言いました。 –

-1

あなたは

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

左結合は何を達成するのですか?参加していないヌルに問題はありません。 –

+0

こんにちは!テーブルBに一致するproduct_idがない場合はどうなりますか?それは除外されます... **それはユーザー全体が除外されることです... – CarpeNoctumDC

関連する問題