SQL:从颜色表中搜索颜色

时间:2015-01-13 10:55:18

标签: mysql sql colors sqlconnection

我有一个不同颜色卡片的数据库。

卡可以是" 无色"或一种或多种颜色: "的红色""的绿色"" " "的""的黑色"

位于卡表 ID,名称以及其他一些卡信息,

并且颜色位于颜色表名称(例如:&#34;红色&#34;),颜色< strong>代码(例如:&#34; r&#34;)和颜色 id

card_id color_id

连接表

问题 如何使颜色可搜索

我希望能够找到所有&#34;只有红色&#34; 的卡片, 以及&#34;红色或蓝色&#34; ,所有卡片 以及&#34;红色和蓝色&#34; 的所有卡片(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
(...)

这个dosnt似乎是一个很好的解决方案!

所以任何想法都会受到赞赏吗?

(最佳我喜欢某种SQL视图..)

2 个答案:

答案 0 :(得分:0)

您可以在此处使用条件聚合。例如,对于红色和蓝色,您希望找到卡片

  1. 两种颜色都存在
  2. 不存在其他颜色
  3. 这意味着如果我计算一张卡的红色和蓝色,我必须得到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
    );
    

答案 1 :(得分:0)

这可能是一个糟糕的解决方案。 :) 将卡片和颜色作为派生表,稍后作为 CTE 进行查询。

2021-04-15 11:55:54.580 10061-15047/com.dev E/>>> percent: >> 0
2021-04-15 11:55:54.580 10061-15047/com.dev E/>>> percent: >> 0.0