我有一张桌子......
----------------------------------------
| 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。
任何帮助都会很棒。
答案 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)
这将返回组中存在两个数字的所有ID。如果您想要只有一个数字的组的ID,请移除DISTINCT。