我们说我的桌子上有五列。
第1列:商店名称和第2至5列:商店类型
对于商店名称,它基本上只包含商店的名称。对于第2-5列,它将包含YES或NO,具体取决于它的商店类型。例如:
StoreName | Clot. | Food | App. | Shoes
Mcdonalds | NO | YES | NO | NO
MC ShoeStore | NO | NO | NO | YES
现在我想提出一个查询,其中我显示所有以字母M开头的商店及其商店类型,而其他商店类型没有' NO'在它出现。
我只知道:
SELECT NameOfStore from table where NameOfStore LIKE '%m'
我不确定我将如何显示包含YES的商店类型。或者这可能吗?
答案 0 :(得分:1)
为了更灵活,我建议您先更改数据结构。
表商店
+--+---------+-------------+
|id|name |store_type_id|
+--+---------+-------------+
| 1|Mcdonalds| 2|
| 2|Mc Shoes | 4|
表 store_type
+--+-----------+
|id|name |
+--+-----------+
| 1|Clothing |
| 2|Fastfood |
| 3|Applicances|
| 4|Shoes |
然后,您只需将商店类型加入商店即可。
SELECT
store.name,
store_type.name AS store_type
FROM
store
LEFT JOIN store_type ON store.store_type_id = store_type.id
如果商店可以有多种类型,您可以使用associative table链接商店表格中的两个而不是store_type_id
列。
表 store_store_types
+--------+-------------+
|store_id|store_type_id|
+--------+-------------+
| 1| 2|
| 2| 1|
| 2| 4|
查询...
SELECT
store.name,
store_type.name AS store_type
FROM
store
LEFT JOIN store_store_type rel ON store.id = rel.store_id
LEFT JOIN store_type ON rel.store_type_id = store_type.id
答案 1 :(得分:0)
您可以简单地使用案例陈述。此外,您的WHERE
条款标准错误。
SELECT
NameOfStore,
CASE
WHEN Clothes = 'YES' THEN 'Clothes'
WHEN Fastfood = 'YES' THEN 'Fastfood'
WHEN Appliances = 'YES' THEN 'Appliances'
WHEN Shoes = 'YES' THEN 'Shoes'
END AS TypeOfStore
FROM
table
WHERE
LOWER(NameOfStore) LIKE 'm%';
处理单个商店的多种商店类型:
SELECT
NameOfStore,
CONCAT_WS(' & ', --This is the separator to use - you can replace this with whatever
CASE WHEN Clothes = 'YES' THEN 'Clothes' END,
CASE WHEN Fastfood = 'YES' THEN 'Fastfood' END,
CASE WHEN Appliances = 'YES' THEN 'Appliances' END,
CASE WHEN Shoes = 'YES' THEN 'Shoes' END
) AS TypeOfStore
FROM
table
WHERE
LOWER(NameOfStore) LIKE 'm%';
您的输出看起来像:
NameOfStore | TypeOfStore
-----------------------------
McDonalds | Fastfood
Mike's Shop | Clothes & Shoes