2011-07-23 5 views
1

イベント、製品、関連テーブルevent_productsという3つのテーブルがあります。MySQLでは、どのようにして参加し、最初のセットのみを取得するのですか?

イベント:event_idが、

製品:PRODUCT_ID、PRODUCT_NAME

event_products:event_idのは、どれもまたはイベントに関連した多くの製品があってはいけません

をPRODUCT_ID。

私の質問は、イベントのリストと、イベントごとに結果の行が1つだけ必要です。リストでは、各イベントごとに1つのプロダクトしか必要としません。最初に追加したプロポーザルが1つだけであるか、できない場合はproduct_idが最も小さいプロダクトが必要です。

select e.event_id, ep.product_id, p.product_name 
FROM `events` e 
LEFT OUTER JOIN event_products ep on ep.event_id = e.event_id 
LEFT OUTER JOIN products p on p.product_id = ep.product_id; 

複数の製品が割り当てられているイベントごとに複数の行が返されます。

おかげ

+0

event_idはイベントのプライマリキーで、製品の製品IDです。 event_idとproduct_idの組み合わせがevent_productsの主キーです。 – sdfor

答えて

1
select e.event_id, min(ep.product_id), p.product_name 
FROM `events` e 
LEFT OUTER JOIN event_products ep on ep.event_id = e.event_id 
LEFT OUTER JOIN products p on p.product_id = ep.product_id 
group by e.event_id, p.product_name 
; 
+0

ありがとうございますが、それでもイベントごとに複数の行が表示されます。 – sdfor

+0

ありがとう、これは1つの小さな変更で動作します。 e.event_idでグループ化するだけで、p.product_nameは含めないでください。したがって、MySQLのSQLは次のようになります。select e.event_id、min(ep.product_id)、p.product_name FROM 'events' e LEFT OUTER JOIN event_products ep on ep.event_id = e.event_id LEFT OUTER JOIN製品p .product_id = ep.product_id グループby e.event_id – sdfor

0
SELECT e.event_id, p.product_id, p.product_name 
FROM products p, 
(SELECT e.event_id as event_id, min(p.product_id) as product_id 
FROM events e, event_products ep, products p 
where e.event_id = ep.event_id, ep.product_id = p.product_id 
group_by e.event_id) e 

これを試してみてください。

+0

うーん、ありがとう。製品がないイベントも必要なので、私は製品テーブルから始められません。また、mysqlには、あなたのsqlには見つからない構文エラーがあると言われています。 – sdfor

+0

内側のクエリを試し、product_nameを付けずに目的の出力が得られるかどうかを確認してください。私は試してみるためにmysqlコマンドラインを持っていないので、構文エラーをお詫びします。 – tryurbest

+0

Mysqlが返すのは次のとおりです。#1064 - SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、適切な構文が '.product_id group_by e.event_id'の近くで使用するようにしてください。e '5行目 – sdfor

0
SELECT `ep`.`product_id`, `p`.`product_name` 
FROM `event_products` AS `ep` 
JOIN `products` AS `p` USING (`product_id`) 
GROUP BY `ep`.`event_id` HAVING `ep`.`product_id`=MIN(`ep`.`product_id`) 

私はあなたがテーブルの上にevent_products追加INDEX(product_id)が必要だろうと推測するあなたのコメントでは(EXPLAINを使用してテスト)

をこのクエリに対して適切なインデックスを使用してください。

+0

このソリューションの問題は、製品なしでイベントを返さないことです。 SELECTは 'イベント中心'でなければなりません。マイナーtweekと@ランディのソリューションが動作します。みんな、ありがとう!!! – sdfor

+0

「製品なしのイベントは返されません」は必須ではありませんでした=あなたの歓迎:) – Dor

関連する問題