我有两个实体:提案和投票。
- 提议:用户可以提出提议。
- 投票:用户可以为提议投票。
CREATE TABLE `proposal` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
);
CREATE TABLE `vote` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`idea_id` int(11) NOT NULL,
`updated` datetime NOT NULL,
PRIMARY KEY (`id`),
);
现在我想获取上升的 Propsals,这意味着:
- 提案标题
- 总票数
- 在过去 3 天内收到投票
我试图在没有 sub 的情况下获取,SELECT
因为我使用的学说不允许 sub SELECT
。所以我的方法是通过加入vote
s 表两次来获取(第一次是为了获取总票数,第二次是为了能够创建一个WHERE
子句来过滤最后 3 天)并执行以下操作INNER JOIN
:
SELECT
p.title,
COUNT(v.p_id) AS votes,
DATEDIFF(NOW(), DATE(x.updated))
FROM proposal p
JOIN vote v ON p.id = v.p_id
INNER JOIN vote x ON p.id = x.p_id
WHERE DATEDIFF(NOW(), DATE(x.updated)) < 3
GROUP BY p.id
ORDER BY votes DESC;
很明显,这将返回错误的votes
数量,因为它会使票数增加三倍COUNT()
。实际上是,因为它和 aCROSS JOIN
一样创建了笛卡尔积。
有什么方法可以在不使用 sub 的情况下获得适当的数量SELECT
?