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;