我有一个网络应用程序,它使用 Facebook ID 或联系人编号作为参与者标识符。这是因为客户不希望那些没有 Facebook 的人错过进入(因此有一个 Web 应用程序和一个 Facebook 应用程序)
所以我正在尝试:
SELECT *, COUNT(*)
FROM `entries_table`
WHERE is_daily_winner = 2
GROUP BY fbid OR contact_no
HAVING COUNT(*) <=4
基本上,我想要实现的是选择 is_daily_winner = 2
的条目每个 fbid
小于或等于 4 行或contact_no
.
目前我只返回了一行,而不是我期望的 3 行。
我做错了什么?或者我可以GROUP BY x OR y
?
编辑:我正在扩展这个问题,因为我忘记包含另一个条款。
HAVING COUNT(*) <=4
应该涵盖所有条目,但我只需要获取最后一天内输入的条目。
我刚刚尝试过:
SELECT * FROM `entries_table`
WHERE `timestamp` >= (CURDATE() - INTERVAL 1 DAY) IN
(SELECT * FROM `entries_table`
WHERE is_daily_winner = 2
GROUP BY fbid
HAVING COUNT(*) <=4
UNION
SELECT * FROM `entries_table`
WHERE is_daily_winner = 2
GROUP BY contact_no
HAVING COUNT(*) <= 4)
我收到错误 Operand should contain 1 column(s)
最佳答案
这个应该可以满足您的要求:
SELECT * FROM (
SELECT *, COUNT(*) AS nr FROM `entries_table`
WHERE is_daily_winner = 2
AND `timestamp` >= (CURDATE() - INTERVAL 1 DAY)
GROUP BY fbid
UNION ALL
SELECT *, COUNT(*) AS nr FROM `entries_table`
WHERE is_daily_winner = 2
AND `timestamp` >= (CURDATE() - INTERVAL 1 DAY)
GROUP BY contact_no
) sq
WHERE nr <= 4
我将 UNION
更改为 UNION ALL
,因为 UNION
隐含 DISTINCT
。我不认为,这就是您想要的(甚至需要,UNION ALL
也更快,因为它不必检查是否有重复的行)。
请注意,选择 *
并按某些内容分组实际上是不好的做法。通过对 group by
中未提及的列进行分组且不使用聚合函数,将为每个组挑选随机行进行显示。只是想提一下。
关于php - 按这个或那个分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16978310/