2012-03-09 9 views
1

を選択されていません、私が選択されているもののアイテムを知りたいと選択されていないものは、これは、リストボックス(またはドロップダウン)のために有用である0は、アイテムを選択し、[なし

になる、それはそれを意味する強調表示されているものはされているガイドLEFT JOIN)

(追加私はSQLを動作させることができなかった:

SELECT StoreID, ft.id, name, count(1) as Selected 
FROM `store_food_type` AS sft 
    LEFT JOIN food_type AS ft 
     ON ft.id = sft.food_type_id 
WHERE StoreID = 17633 
GROUP BY ft.id 

UNION 

SELECT 0, ft.id, name, 0 as Selected FROM food_type AS ft 

編集:それがエラーを生成しなかった、それは私がいけないその結果を示したが、nameが重複している

を。

それはこのように表示されます。

+------------+------+----------+----------+ 
| StoreID | id | name  | Selected | 
+------------+------+----------+----------+ 
|  17633 | 1 | Indian |  1 | 
|  17633 | 8 | American |  1 | 
|   0 | 1 | Indian |  0 | 
|   0 | 2 | English |  0 | 
|   0 | 25 | Kurdish |  0 | 
|   0 | 5 | Chinese |  0 | 
|   0 | 7 | Turkish |  0 | 
|   0 | 8 | American |  0 | 
+------------+------+----------+----------+ 

私は結果は次のように表示する:

+------------+------+----------+----------+ 
| StoreID | id | name  | Selected | 
+------------+------+----------+----------+ 
|  17633 | 1 | Indian |  1 | 
|  17633 | 8 | American |  1 | 
|   0 | 25 | Kurdish |  0 | 
|   0 | 5 | Chinese |  0 | 
|   0 | 7 | Turkish |  0 | 
|   0 | 8 | American |  0 | 
+------------+------+----------+----------+ 
+1

このクエリはどのように機能しませんか?エラーが発生しますか?エラーなしで実行されますが、行が選択されないか、間違った行が返されますか? –

+0

@MarkBannister私は自分の質問を更新しました。 –

+0

食品は同じ店で複数回選べますか? – Griffin

答えて

1

あなたの行がクエリであるためUNIONの重複取得されています。実際には、クエリ全体が後方にあります - すべての食品タイプのリストを取得しようとしていますが、指定された店舗にリストされている場合はインジケータが表示されます。

代わりにこれを試してみてください:

SELECT ft.id, ft.name, COALESCE(sft.storeId, 0) as storeId, 
     CASE WHEN sft.storeId IS NOT NULL THEN '1' 
      ELSE '0' END as selected 
FROM food_type a ft 
LEFT JOIN store_food_type as sft 
ON sft.food_type_id = ft.id 
AND sft.storeId = 17633 

を使用すると、厳密にselected列は必要ありませんが、あなたは、単に結果の列storeIdが0であったか否かをテストすることができよう。

1

おそらく最も簡単な方法は、グループにあなたのUNION句、クエリの結果だろう - そうのように:

SELECT MAX(StoreID) StoreID, id, MAX(name) name, MAX(Selected) Selected FROM 
(SELECT StoreID, ft.id, name, count(1) as Selected 
FROM `store_food_type` AS sft 
    LEFT JOIN food_type AS ft 
     ON ft.id = sft.food_type_id 
WHERE StoreID = 17633 
GROUP BY ft.id 
UNION 
SELECT 0, ft.id, name, 0 as Selected FROM food_type AS ft) sq 
GROUP BY id 
0

私はこの答えはマーク・バニスターが提供するすべてのUNIONよりも良い選択肢であるわからないんだけど、それそれを行う別の方法です。

SELECT sft.storeid, ft.id, ft.name, count(sft.storeid) selected 
FROM store_food_type sft 
     FULL JOIN food_type ft ON ft.id = sft.food_type_id 
WHERE sft.storeid = 17633 or sft.storeid is null 
GROUP BY ft.id, ft.name, sft.storeid 

食品のみ任意のストアに一度に選択することができる場合は、「選択」フィールドとGROUP BYは冗長です。

+0

私はMySQLが 'FULL JOIN'をサポートしていないと思います –

関連する問題