Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我需要帮助写一个复杂的SELECT语句_Sql - Fatal编程技术网

Sql 我需要帮助写一个复杂的SELECT语句

Sql 我需要帮助写一个复杂的SELECT语句,sql,Sql,我正在尝试编写一个sql语句,该语句将从一个表中选择项,并根据另一个表的结果对其排序 这两个表是: 事件: 身份证,姓名 出席人数: 用户、事件 我有这样的说法: 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的朋友的数量 现在,我想将该语句与另一个语句组合起来,创建一个选择所有事件的语句,并按要进行的好友数排序。。。

我正在尝试编写一个sql语句,该语句将从一个表中选择项,并根据另一个表的结果对其排序

这两个表是:

事件: 身份证,姓名

出席人数: 用户、事件

我有这样的说法:

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的朋友的数量

现在,我想将该语句与另一个语句组合起来,创建一个选择所有事件的语句,并按要进行的好友数排序。。。 我怎样才能写出那句话?


非常感谢你,阿米尔。

我想试试这样的东西:

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

然而,尽管我会尝试类似的方法,但事实上我还没有,所以这可能不会像现在这样起作用。

我会尝试类似的方法:

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

然而,尽管我会尝试类似的方法,但事实上我还没有,所以这可能无法正常工作。

您也可以使用如下连接:

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

您还可以使用连接,如:

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

假设数字列表是您感兴趣的朋友集(最好将他们存储在一个表中-这就是您在数据库中记录信息的方式),那么:

当然,复杂性在旁观者的眼中——这实际上并不复杂。请注意,如前所述,它不会列出所有好友都不参加的活动。如果需要,则需要左外部联接,并且需要早于主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;
如果组中的所有行在用户列中都包含NULL,则计数(用户)聚合将返回零


未经测试的SQL。

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

当然,复杂性在旁观者的眼中——这实际上并不复杂。请注意,如前所述,它不会列出所有好友都不参加的活动。如果需要,则需要左外部联接,并且需要早于主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;
如果组中的所有行在用户列中都包含NULL,则计数(用户)聚合将返回零


未经测试的SQL。

也工作得很好,但我不确定填写表格以测试它所需的效率。。。谢谢大家!@阿米尔:记住正确性首先重要;只有当事情正确时,效率才会发挥作用。此外,如果朋友集在一个表中,那么您将有第三个联接,并且您可能会发现优化器在使用表时比在中更有效。将好友数从15个增加到75个,您可能会发现该表的性能优于中的。(早在1990年左右,我就必须编写一个自适应查询生成器,因为对于in子句中的小值集,in表示法是最好的,但是对于大值集,最好将该集存储在(临时)表中并将其联接!)那么,您能告诉我如何使用临时表来创建它并联接它吗?因为我只找到了一种方法来做到这一点。。。感谢you@Amir:我无法告诉您如何在DBMS中创建临时表,因为您没有告诉我您使用的DBMS。你可以像我一样阅读手册。@Amir:我强烈暗示你应该RTFM,不要问愚蠢的后续问题(请参阅;相关的FM是。但是,从长远来看,您可能会更改朋友列表,或创建更多的朋友组。然后,您将需要一个标识朋友集的常规表。更改表中的数据比查找将数字列表编码为SQL语句的所有位置更容易。同样,工作也非常努力od,但我不确定填充表格以测试它的效率…谢谢!@Amir:记住正确性首先重要;只有当某些东西正确时,效率才会发挥作用。此外,如果朋友集在一个表格中,你会有第三个联接,你可能会发现优化器在使用表格时工作得更好IN.将好友数从15增加到75,您可能会发现该表的性能优于IN(早在1990年左右,我就必须编写一个自适应查询生成器,因为对于IN子句中的小值集,IN表示法是最好的,但是对于大值集,最好将该集存储在(临时)表中并加入它!)好的,你能告诉我如何用临时表创建它并加入它吗?因为我只找到了这样做的方法…谢谢you@Amir:我无法告诉您如何在数据库管理系统中创建临时表,因为您没有告诉我您使用的是哪种数据库管理系统。而且您可以像我一样阅读手册。@Amir:我强烈暗示您应该使用RTFM,而不要问我y.后续问题(请参阅;相关的FM是。但是,从长远来看,您可能会更改朋友列表,或创建更多的朋友组。然后您将需要一个标识朋友集的常规表。更改表中的数据比查找将数字列表编码为SQL语句的所有位置更容易。