我已经制作了一个已经可以运行的投票脚本,但我想练习一些 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/