我需要帮助编写复杂的SELECT语句

时间:2011-01-22 14:28:45

标签: sql

我正在尝试编写一个sql语句,它将从一个表中选择项目并按其他表的结果对其进行排序。

这两个表是:

事件: id,name

出勤: 用户,事​​件

我得到了这个声明:

SELECT * 
FROM `attendance` 
WHERE event='1' 
  AND user IN (1,2,3,4,5,6,7,8,9,10,11,12,13,444,153)

我用这个来获得参加1号活动的朋友数量。

现在我想将该语句与另一个语句结合起来创建一个选择所有事件的语句,然后根据要去的朋友数来排序... 我该怎么写这个陈述?

非常感谢,Amir。

3 个答案:

答案 0 :(得分:3)

我会尝试这样的事情:

SELECT
    id,
    name,
    (SELECT COUNT(*) FROM attendance att WHERE att.event = ev.id) AS attending
FROM
    event ev
ORDER BY
    attending DESC

然而,虽然我尝试类似的东西,但事实是我没有,所以这可能不会按原样运作。

答案 1 :(得分:1)

你也可以使用如下的连接:

SELECT events.id, COUNT(attendance.user) AS attending
FROM attendance INNER JOIN events ON attendance.event = events.id
WHERE (attendance.user IN (1,2,3,4,5,6,7,8,9,10,11,12,13,444,153))
GROUP BY events.id
ORDER BY attending DESC

答案 2 :(得分:0)

假设数字列表是您感兴趣的朋友组(最好将它们存储在表中 - 这就是您在数据库中记录信息的方式),然后:

SELECT e.id, e.name, COUNT(*) AS friends
  FROM attendance AS a
  JOIN event      AS e ON a.event = e.id
 WHERE a.user IN (1,2,3,4,5,6,7,8,9,10,11,12,13,444,153)
 GROUP BY e.id, e.name;

当然,复杂性在旁观者的眼中 - 这实际上并不复杂。请注意,如上所述,它不会列出任何朋友都没有去过的事件。如果你想要,你需要一个LEFT OUTER JOIN,你需要比主WHERE子句更早的'friend filter':

SELECT e.id, e.name, COUNT(user) AS friends
  FROM event AS e
  LEFT OUTER JOIN
       (SELECT user, event
          FROM attendance
         WHERE user IN (1,2,3,4,5,6,7,8,9,10,11,12,13,444,153)
       ) AS a
    ON a.event = e.id
 GROUP BY e.id, e.name;

如果组中的所有行在用户列中包含NULL,则COUNT(用户)聚合返回零。

未经测试的SQL。