我有一个包含不同颜色卡片的数据库。
卡片可以是“无色”或一种或多种颜色: "红色","绿色","白色","蓝色","黑色”
卡片在卡片表中,包含id、name和一些其他卡片信息,
颜色在颜色表中,名称(例如:“红色”),颜色代码(ex:"r") 和颜色 id
还有一个连接表,包含card_id和color_id
所以问题是如何使颜色可搜索?
我希望能够找到所有“只有红色”的卡片,
以及所有“红色或蓝色”的卡片,
以及所有“红色和蓝色”的卡片(对于 3,4 和 5 种颜色也是如此!)
有 30 种不同的颜色组合:
//000001//000010//000011//000100//000101//000110//000111
//001000//001001//001010//001011//001100//001101//001111
//010000//010001//010010//010011//010100//010101//010110
//010111//011000//011001//011010//011011//011100//011101
//011111
//100000 (Colorless)
我发现这对 UNION 是可行的,但是
必须做出所有 30 种不同的组合,然后将它们全部组合在一起!
SELECT
c.id
'false' AS Colors,
'true' AS Red,
'false' AS Blue
'false' AS Green
'false' AS White
'false' AS Black
'false' AS Colorless
FROM cards_data AS c
INNER JOIN con_cards_colors AS ccc_red ON c.id = ccc_red.cards_id
INNER JOIN colors AS co_red ON co_red.id = ccc_red.colors_id
WHERE
co_red.name = "Red"
Union
(...)
这似乎不是一个好的解决方案!
所以任何想法都会受到赞赏?
(最好我喜欢某种 SQL View..)
最佳答案
您将在此处使用条件聚合。例如,对于红色和蓝色,您想在其中找到卡片
- 两种颜色都存在
- 不存在其他颜色
这意味着如果我计算一张卡片的红色和蓝色,我必须得到 2。如果我计算所有颜色,我也必须得到 2。(对于一种、三种或更多颜色也是如此。)
所以使用这个查询,只改变提到的颜色和颜色的数量:
select *
from cards_data where id in
(
select cards_id
from con_cards_colors
group by cards_id
having count(case when colors_id in (select id from colors where name in ('Red','Blue')) then 1 end) = 2 -- i.e. find all
and count(*) = 2 -- i.e. find only those and no others
);
关于mysql - SQL:使颜色表中的颜色可搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27920494/