Mysql 根据多个条件进行选择
如果我们有两张这样的桌子Mysql 根据多个条件进行选择,mysql,Mysql,如果我们有两张这样的桌子 CREATE TABLE ta(`ID` int, `name` char(10)); INSERT INTO ta (`ID`, `name`) VALUES (1, 'A'), (2, 'A'), (3, 'B'), (4, 'C'), (5, 'B'); CREATE TABLE yourtable(`ID` int, `Val` int); INSERT INTO yourtable (`ID`, `Val`) VALU
CREATE TABLE ta(`ID` int, `name` char(10));
INSERT INTO ta (`ID`, `name`)
VALUES
(1, 'A'),
(2, 'A'),
(3, 'B'),
(4, 'C'),
(5, 'B');
CREATE TABLE yourtable(`ID` int, `Val` int);
INSERT INTO yourtable (`ID`, `Val`)
VALUES
(1, 10),
(1, 20),
(1, 30),
(1, 30),
(2, 10),
(2, 20),
(3, 20),
(3, 20),
(4, 10),
(4, 20),
(5, 10),
(5, 20),
(5, 30);
我需要使用两个表按名称对值进行分组。并且,对于条件val=10或val=30,它可以正常工作
但是,对于条件val=10和val=30我如何查询它?
其中,输出应为
Count
A 1
B 0
C 1
这里有一个例子:以name=A为例,我们得到ID=1,2。所以,现在在表yourtable中,我们有5行ID=1,2。对于ID=1,val=10,20,20。对于ID=2,val=10,20。这里只有ID=2满足val=10和val=30所以,对于name=A count=1
SELECT ta.name
, COUNT(DISTINCT t2.val)
FROM yourtable t1
LEFT
JOIN yourtable t2
ON t2.id = t1.id
AND t2.val IN (30) -- <-- things to exclude
LEFT
JOIN ta
ON ta.id = t1.id
WHERE t1.val IN (10) -- <-- things to include
GROUP
BY name;
NAME COUNT(T2.VAL)
A 1
B 1
C 0
您希望在表上有一个子查询来确定ID是否满足条件,并将其连接到ta
不是很好,但很有效:
SELECT name, max(occ) occurencies
FROM (SELECT name, count(distinct t1.id) as occ
FROM yourtable as t1, ta
WHERE t1.id=ta.id
AND val=10
AND NOT EXISTS (SELECT name
FROM yourtable as t2
WHERE t2.id=ta.id AND t2.val=30)
GROUP BY name
UNION
SELECT name, 0 as occ
FROM yourtable as t1, ta
WHERE t1.id=ta.id
AND val=10
AND EXISTS (SELECT name
FROM yourtable as t2
WHERE t2.id=ta.id AND t2.val=30)) as base
GROUP BY name;
退房:
p、 美国:稍微好一点:
SELECT ta.name, COALESCE (occ, 0)
FROM ta
LEFT JOIN (SELECT name, count(distinct t1.id) as occ
FROM yourtable as t1, ta
WHERE t1.id=ta.id
AND val=10
AND NOT EXISTS (SELECT name
FROM yourtable as t2
WHERE t2.id=ta.id
AND t2.val=30)
GROUP BY name) AS base ON (base.name = ta.name)
GROUP BY name;
:奇怪的状况。如果val=10,则不能等于30,因此条件的第二部分没有意义,因此您所需的结果与条件不匹配。对于val=10,有2个A,1个B和1个C。这里有一个例子:以name=A为例,我们得到ID=1,2。所以,现在在表yourtable中,我们有5行ID=1,2。对于ID=1,val=10,20,20。对于ID=2,val=10,20。这里只有ID=2满足val=10和val=30所以,对于name=A count=1,这对我来说非常有意义!嗯,如果没有一些主键,可能很难提供一个确定的解决方案。您缺少用0打印空的。现在结果不匹配mmm不,B是0,C是1索引B是0,因为没有带val 10和val 30的B id,C有1,A有1,所以他的输出似乎符合逻辑。据我所知,只有在给定ID不包含数字30且确实包含数字10的情况下,他才会选择ID。通过您的更新,现在可以选择,但通过您的上一个小提琴,它没有选择,这可能是因为我不知道sqlfiddle是如何工作的,如果只运行查询的一部分,那么它提供的URL似乎只包含该部分
SELECT name, max(occ) occurencies
FROM (SELECT name, count(distinct t1.id) as occ
FROM yourtable as t1, ta
WHERE t1.id=ta.id
AND val=10
AND NOT EXISTS (SELECT name
FROM yourtable as t2
WHERE t2.id=ta.id AND t2.val=30)
GROUP BY name
UNION
SELECT name, 0 as occ
FROM yourtable as t1, ta
WHERE t1.id=ta.id
AND val=10
AND EXISTS (SELECT name
FROM yourtable as t2
WHERE t2.id=ta.id AND t2.val=30)) as base
GROUP BY name;
SELECT ta.name, COALESCE (occ, 0)
FROM ta
LEFT JOIN (SELECT name, count(distinct t1.id) as occ
FROM yourtable as t1, ta
WHERE t1.id=ta.id
AND val=10
AND NOT EXISTS (SELECT name
FROM yourtable as t2
WHERE t2.id=ta.id
AND t2.val=30)
GROUP BY name) AS base ON (base.name = ta.name)
GROUP BY name;