Mysql - 选择至少一个或选择none

时间:2013-12-06 00:01:08

标签: mysql sql

我有一张桌子......

----------------------------------------
| id |     name      |  group | number |
----------------------------------------
|  1 |          joey |      1 |     2  |
|  2 |         keidy |      1 |     3  |
|  3 |         james |      2 |     2  |
|  4 |        steven |      2 |     5  |
|  5 |         jason |      3 |     2  |
|  6 |         shane |      3 |     3  |
----------------------------------------  

我正在运行这样的选择:

SELECT * FROM table WHERE number IN (2,3);

我试图解决的问题是,我只想从每个数字中包含1行或更多行的组中获取结果。例如,上面的查询返回id为1-2-3-5-6,当我希望结果排除id 3,因为'2'组只能返回1的结果为'2'而不是对于BOTH 2和3,由于组2中没有数字3的行,我甚至根本不选择ID 3。

任何帮助都会很棒。

3 个答案:

答案 0 :(得分:1)

以这种方式试试

SELECT *
  FROM table1 t
 WHERE number IN(2, 3)
   AND EXISTS
(
  SELECT *
    FROM table1
   WHERE number IN(2, 3)
     AND `group` = t.`group`
   GROUP BY `group`
  HAVING MAX(number = 2) > 0
     AND MAX(number = 3) > 0
)

SELECT *
  FROM table1 t JOIN 
(
  SELECT `group`
    FROM table1
   WHERE number IN(2, 3)
   GROUP BY `group`
  HAVING MAX(number = 2) > 0
     AND MAX(number = 3) > 0
) q 
    ON t.`group` = q.`group`;

SELECT *
  FROM table1 
 WHERE `group` IN
(
  SELECT `group`
    FROM table1
   WHERE number IN(2, 3)
   GROUP BY `group`
  HAVING MAX(number = 2) > 0
     AND MAX(number = 3) > 0
);

示例输出(对于两个查询):

| ID |  NAME | GROUP | NUMBER |
|----|-------|-------|--------|
|  1 |  joey |     1 |      2 |
|  2 | keidy |     1 |      3 |
|  5 | jason |     3 |      2 |
|  6 | shane |     3 |      3 |

这是 SQLFiddle 演示

答案 1 :(得分:1)

在这个问题上,您可以通过多个联接的有趣方式接近您想要的资格,或者,应用预先查询来获取其他人建议的所有合格组,但是对我来说可读性有点偏差。

无论如何,这里有一种方法,但是有了连接

select DISTINCT
      T.id,
      T.Name,
      T.Group,
      T.Number
   from
      YourTable T
         Join YourTable T2
            on T.Group = T2.Group AND T2.Group = 2
         Join YourTable T3
            on T.Group = T3.Group AND T3.Group = 3
   where
      T.Number IN ( 2, 3 )

所以在第一个记录中,它指向它自己的组到T2组,T2组特别是2 ...然后再次,但测试组的T3实例和T3的组是3。

如果它无法完成T2或T3实例中的任何一个的连接,则记录完成以供考虑,并且因为索引对于这样的连接非常有效,所以请确保您有一个指数用于NUMBER条件,另一个索引用于那些比较的(GROUP,NUMBER)和下一个查询样本...

如果超过这个简单的2,但更大的组,预先查询合格的组,然后加入到

select
      YT2.*
   from
      ( select YT1.group
           from YourTable YT1
           where YT1.Number in (2, 3)
           group by YT1.group
           having count( DISTINCT YT1.group ) = 2 ) PreQualified
      JOIN YourTable YT2
         on PreQualified.group = YT2.group
         AND YT2.Number in (2,3)

答案 2 :(得分:-1)

如果我理解你,也许这就是

  SELECT id FROM table WHERE `group` IN
    (SELECT `group` FROM table WHERE number IN (2,3) 
    GROUP BY `group` 
    HAVING COUNT(DISTINCT number)=2)

SQL Fiddle

这将返回组中存在两个数字的所有ID。如果您想要只有一个数字的组的ID,请移除DISTINCT。