基于select的MYSQL查询选择

3
您的帮助将不胜感激... 如果我有以下表和示例数据... myGroupTable group_Id : user_Id 1 : 3 1 : 7 1 : 100 2 : 3 2 : 7 2 : 100 2 : 104 4 : 42 4 : 98 4 : 13
我想要一条SQL语句... 返回一个包含指定user_Id的group_Id。 例如...是否有一个group_Id包含用户ID 3、7和100? 答案:group_id为1。 请注意,我不希望它返回group_Id 2,因为它也有一个user_Id为104的用户。 谢谢!

1
你尝试了什么?有什么不起作用的地方吗? - Arnaud Le Blanc
我只是需要指引正确的方向...使用IN不起作用,因为使用我上面的例子...group_Id 2也会被选中,因为这些值在group_id 2中...但如果它们都在同一组中且没有更多的组,则只想选择它。 - jon
谢谢ajreal,但那不是一个选项。 - jon
4个回答

2
SELECT
    group_Id,
    SUM(
        IF user_Id = 3 THEN 1
        ELSEIF user_Id = 7 THEN 2
        ELSEIF user_Id = 100 THEN 4
        ELSE 8
    ) AS bits
FROM myGroupTable
GROUP BY group_Id
HAVING bits=7

这假设在同一组中不能有重复的用户ID,例如以下情况永远不会发生:
group     user
   1         3
   1         3

编辑:您可以按照以下方式构建查询:

<?php
$ids = array(3, 7, 100);
$power = 2;
$query = "
    SELECT
    group_Id,
    SUM(
        IF user_Id = " .$ids[0]. " THEN 1 ";
foreach ($id in $ids) { 
    $query .= " ELSEIF user_Id = $id THEN " . $power;
    $power = $power * 2;
}
$query .= " ELSE $power
    ) AS bits
    FROM myGroupTable
    GROUP BY group_Id
    HAVING bits = " . ($power - 1);

聪明的方法。应该注意这里使用的“1”、“2”和“4”与问题中的1、2、4组无关,而实际上是2的幂。您将根据成员按需构建此查询,如果需要4个成员,则下一个将是“8”,然后是“16”等等。 - dkamins
是的,请注意,1、2、4、8、16等都是2的幂,最后的else必须是另一个2的幂。 - Robert Martin
最终的 bits=X 是除了 ELSE 字段中的那个以外,所有二的幂次之和。 - Robert Martin
如果用户需要输入不同的值进行比较怎么办?他只是举了一个例子。 - jagbandhuster
@Robert Martin 谢谢您,Robert Martin。 - jon
@jon 不用谢。如果你认为这是正确的答案,欢迎标记它。 - Robert Martin

1

这里有另一种选择:

SELECT group_id, GROUP_CONCAT(user_id ORDER BY user_id) AS user_id_list
FROM group_user
GROUP BY group_id
HAVING user_id_list = '3,7,100'

感谢您的帮助...如果您有一个大型数据库,这个程序会运行得很慢吗...还是这是最好的解决方案?...顺祝商祺。 - jon

0
另一种解决方案:
SELECT group FROM tbl WHERE group_id NOT IN (SELECT DISTINCT group_id FROM tbl WHERE user_id NOT IN(3,7,100)) AND user_id IN (3,7,100);

-1
select group_id,
sum(
  case user_id in(3,7,100)
  when 1 then 1
  else -99
  end
) as must_be_3
from group_user
group by group_id
having must_be_3=3;

这将匹配group_id 2,而OP不想要。 - Bill Karwin
谢谢@Bill...关于哪个更好的问题...这个是否会比你上面发布的使用GROUP_CONCAT的示例更快?...顺祝商祺 - jon
我无法预测,因为它取决于数据库的大小、运行它的服务器、索引的存在等因素。 - Bill Karwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接