Mysql 正在获取所选项目,但未选择任何项目
我想知道选择了哪些项目,而未选择的项目将变为0 这对于列表框(或下拉列表)很有用,任何突出显示的内容都表示它已被添加(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 =
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 columnstoreId
是否为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不支持“完全加入”