2011-01-22 105 views
0

我想写一个SQL语句将被其他表的结果中选择一个表,并责令项目..我需要帮助写一个复杂的SELECT语句

2个表是:

事件: ID,名称

考勤: 用户,事件

香港专业教育学院得到这个统计EMENT:

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

现在我想这句话用另一个结合起来,创建选中的所有事件的声明数量,并根据朋友的数量来排序... 我该如何写这句话?

非常感谢,埃米尔。

回答

3

我会尝试这样的事:

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

不过,虽然我尝试类似的东西,其实是我没有,所以这可能无法正常工作的。

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 
+0

工作perefectly ..谢谢! – Amir 2011-01-22 15:18:11

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子句前面:

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; 

的COUNT(用户)合计返回零如果一个组中的所有行包含NULL在用户列中。

未经测试的SQL。

+0

也工作得很好,但我不知道我需要填写表以测试它的效率......谢谢! – Amir 2011-01-22 15:19:04