我有一个使用Facebook ID或Contact#作为参赛者标识符的网络应用程序。这是因为客户不希望没有Facebook的人错过进入(所以有一个网络应用程序以及一个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
或contact_no
的4行。
目前我只退回一行,而不是我期待的那一行。
我做错了什么?或者我甚至可以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)
答案 0 :(得分:1)
您可以更好地使用 UNION ,如
SELECT *, COUNT(*)
FROM `entries_table`
WHERE is_daily_winner = 2
GROUP BY fbid
HAVING COUNT(*) <=4
UNION
SELECT *, COUNT(*)
FROM `entries_table`
WHERE is_daily_winner = 2
GROUP BY contact_no
HAVING COUNT(*) <=4
答案 1 :(得分:1)
这个应该做你想做的事:
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
中未提及的列进行分组并且没有聚合函数,将为每个组选择随机行以进行显示。只是想提一下。