1

我有两个实体:提案和投票。

  • 提议:用户可以提出提议。
  • 投票:用户可以为提议投票。
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。所以我的方法是通过加入votes 表两次来获取(第一次是为了获取总票数,第二次是为了能够创建一个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()。实际上是2^n,因为它和 aCROSS JOIN一样创建了笛卡尔积。

有什么方法可以在不使用 sub 的情况下获得适当的数量SELECT

4

1 回答 1

1

相反,您可以使用这种模式创建一种COUNTIF函数:
-COUNT(CASE WHEN <condition> THEN <field> ELSE NULL END)

例如...

SELECT
  p.title,
  COUNT(v.p_id) AS votes,
  COUNT(CASE WHEN v.updated >= DATEADD(DAY, -3, CURRENT_DATE()) THEN v.p_id ELSE NULL END) AS new_votes
FROM
  proposal p
JOIN
  vote     v
    ON p.id = v.p_id
GROUP BY
   p.title
ORDER BY
   COUNT(v.p_id) DESC
;
于 2014-02-25T19:27:55.143 回答