Mysql 正在获取所选项目,但未选择任何项目

Mysql 正在获取所选项目,但未选择任何项目,mysql,sql,database,Mysql,Sql,Database,我想知道选择了哪些项目,而未选择的项目将变为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 =

我想知道选择了哪些项目,而未选择的项目将变为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 |
+------------+------+----------+----------+
我希望结果如下所示:

+------------+------+----------+----------+
| 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 |
+------------+------+----------+----------+

由于查询中的
联合
,您的行被复制。事实上,您的整个查询是反向的-您试图获取所有食品类型的列表,如果它们是针对给定商店列出的,则带有一个指示符

请尝试以下方法:

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
列,因为您可以简单地测试result column
storeId
是否为0。

最简单的方法可能是将联合查询的结果分组,如下所示:

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

我不确定这个答案是否比马克·班尼斯特(MarkBannister)提出的工会方案更好,但这是另一种方式

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

如果一个食品项目只能为任何给定的商店选择一次,那么“selected”字段和GROUP BY是多余的。

此查询以何种方式失败?它是否产生错误,是否运行时没有错误但没有选择行,还是返回了错误的行?@MarkBannister我已经更新了我的问题。一种食物可以被同一家商店多次选择吗?我认为MySQL不支持“完全加入”