2015-01-13 29 views
1

我有一个数据库与不同颜色的卡片。SQL:使颜色表的颜色可搜索

一张卡片可 “无色” 或一种或多种颜色: “”, “绿色”, “”, “”, “

处于卡表ID,名称和一些其他的卡信息,

颜色处于色表(比如: “红”),彩色(例如: “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) 

我发现吨帽子这是可以与联盟
人必须使所有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似乎是一个很好的解决方案!

那么,任何idears将不胜感激?

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

+0

在我意见“无色”不应该是一种颜色,而是颜色的缺失。否则,例如可以制作无色和红色的卡片。 –

+0

#Thorsten:我同意,这只是数据库的制作方式,因为这些卡片来自JSON表示,它具有无色.. –

回答

0

你会在这里使用条件聚合。对于红色和蓝色比如你要寻找到

  1. 两种颜色存在卡
  2. 没有其他颜色的存在

这意味着,如果我算红色和蓝色的卡片我必须得到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 
); 
+0

对不起,我错过了CASE关键字。我编辑了我的答案。 –

+0

谢谢,它工作。 –

+0

看来,这种方式获得id dosnt工作得很好,那么你需要更多的一个参数。需要2分钟才能得到结果(在我的Mysql数据库中),有时它在我尝试联合使用两个选择(例如颜色和类型)时从未给出结果?使用UNION有更好的方法吗? –