mysql - ORDER BY 来自不同表的具有相同选项 ID 的行数

标签 mysql sql sql-order-by

我已经制作了一个已经可以运行的投票脚本,但我想练习一些 MySQL 来尝试通过 SQL 查询对结果进行排序/过滤,而不是将整个表作为数组并使用循环来处理。

我遇到了根据投票次数对投票选项进行排序的问题。我的数据库有 3 个与此脚本相关的表:

  • vote_votes - 包含投票数,每次投票占一行
  • vote_options - 包含每次投票的可能选项
  • vote_list - 包含带有标题、类型等的投票列表。

我的原始脚本刚刚使用与当前访问的投票 ID 匹配的所有选项

SELECT * FROM vote_options WHERE vote_options.vid = $voteID

然后计算数组中 vote_votes 中与选项唯一 ID 匹配的行数,然后使用自定义排序函数根据行数对其进行排序。

我想在 one 查询中做同样的事情,我认为这是可能的,我只是不知道如何做。这是我当前的 SELECT 语句:

SELECT
    options.optid as id,
    options.value as value
FROM vote_options options
WHERE vid = {$vote['vid']};");

基本上,在vote_votes内部,每个条目都有一个唯一的entryid和一个optid列,我想将其添加到查询中这些条目的计数方式为 WHERE vote_votes.optid = options.optid(选项 ID 是唯一的,因此无需同时查找投票 ID)。

我希望这会起作用,但这显然是错误的。这是我在放弃并在这里提出问题之前得到的最接近的结果。

SELECT
    options.optid as id,
    options.value as value
FROM vote_options options
WHERE vid = {$vote['vid']}
ORDER BY (
    SELECT COUNT(*)
    FROM vote_votes
    WHERE vote_votes.optid = options.optid
) DESC;

最佳答案

我找到了解决方案,只需将括号中的 SELECT 移动到正确的位置即可:

SELECT
    options.optid as id,
    options.value as value,
    options.vid as voteid,
    (
        SELECT COUNT(*)
        FROM vote_votes votes
        WHERE votes.optid = options.optid
    ) as votes
FROM vote_options options
WHERE options.vid = {$vote['vid']}
ORDER BY votes DESC;

关于mysql - ORDER BY 来自不同表的具有相同选项 ID 的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25577640/

相关文章:

sql - 如何选择有序组的第一个和最后一个值?

python - Django自定义order_by算法

MySQL 将 STRING 排序为 INT 并插入

sql - 未提供 ORDER BY 时 postgres 如何排序结果

php - MySQL嵌套资源(透视表)权限查看/更新/管理

sql - PostgreSQL 中的 YYYY-MM 列类型

php - MVC/PDO : how to build a model using PDO's prepared statements syntax?

sql - 如何在 Oracle 中使用 select 更新列

java - Hibernate 关系注解

mysql - Cakephp 3 小写sql查询