2017-06-12 36 views
0

我是数据库中的一个begginer。我的问题是困难的,因为我不是英语,良好的用言语来解释,所以这里是我会做:语法和IN(每个)而不是MySQL中的IN(或)问题

SELECT DISTINCT(link) 
FROM foo 
WHERE 
(
    foo.name IN('bar1' AND 'bar2') 
) 
AND 
(
    foo.text IN('bar3' AND 'bar4' AND ...) 
) 
AND 
(
    foo.desc = 'bar' 
) 
AND (...) etc.. 
LIMIT 100 

如果发现这个解决方案似乎伟大的工作,但不是在我的多的情况下,语句(当syntaxe不允许有GROUPBY +具有在每个括号中):

foo.name IN('bar1', 'bar2') // len = 2 
GROUP BY link 
HAVING COUNT(foo.name) = 2 // len 

可能难以所以这里明白的是表的一个简单的例子:

| id | link | name | 
| -- | ---- | ---- | 
| 01 | HG.C | bar1 | 
| 02 | IJ.N | bar2 | 
| 03 | HG.C | bar2 | 
| 03 | SZ.W | bar3 | 

SELECT DISTINCT(link) 
FROM foo 
WHERE 
(
    foo.name IN('bar1' AND 'bar2') 
) 

应该换货政... rn:HG.C

我尝试了很多失败的东西,所以我仍然在寻找一种方法......我想我的大脑没有格式化(还)为SQL。如果有人能帮助我,那会很好。

+0

在旁注:“DISTINCT”不是函数。所以你的括号只是令人困惑。你应该删除它们。 (但是,您不希望在这里使用DISTINCT,而是使用GROUP BY进行聚合。) –

回答

0

您正在寻找一个聚合,你在哪里得到每link一行结果。但您只想显示符合特定条件的链接。使用HAVING子句来过滤结果:

SELECT link 
FROM foo 
GROUP BY link 
HAVING SUM(name = 'bar1') > 0 
    AND SUM(name = 'bar2') > 0 
    AND SUM(text = 'bar3') > 0 
    AND SUM(text = 'bar4') > 0 
    AND SUM(desc = 'bar') > 0; 

这只能说明你的链接是有名字='BAR1的记录,并与NAME =“BAR2”的记载,也...

查询使用MySQL的true = 1,false = 0.因此,我们计算出现次数为SUM(name = 'bar1')

如果需要的话,你可以要求相结合的标准,也:

AND SUM(name = 'bar2' AND text = 'bar4') > 0 

您可以添加一个WHERE子句加快这(以只看该有个名字“BAR1”或“BAR2记录'和文本'bar3'或'bar4'等)。

+0

谢谢soooo,这节省了我的一天。 我希望这不会太长,因为我在一个非常大的数据库上这样做,但我会尝试使用WHERE子句。 – Thomas

0

您可以通过具有使用组,但对于整个语句...

select link 
    from foo 
    where foo.name IN('bar1' AND 'bar2') 
    group by foo.link 
    having count(foo.link)>2