2013-03-01 12 views
0

我有表有这样的数据:MySQL的:这比萨饼喜欢的客户端

1. John | seafood pizza 
2. Mike | pepperoni pizza 
3. Mike | pepperoni pizza 
4. John | original pizza 
5. Mike | original pizza 
6. John | seafood pizza 
7. John | pepperoni pizza 

....

我怎么能写给我造成这个这样一个查询:

John | seafood pizza 
Mike | pepperoni pizza 

如果客户对许多比萨饼有相同的数量,结果可能是任何比萨的名字。

+0

为什么约翰在结果中拿到海鲜比萨,而不是原来的比萨饼或意大利辣香肠比萨饼(IMHO的最佳选择)?有没有一个数量栏作为决定的基础,这里没有显示? – 2013-03-01 09:38:43

+0

可以说每一行的数量是1. – Jbsh 2013-03-01 09:43:36

回答

0

我会去按用户和比萨分组计数,然后使用这个作为一个查询的数据源,找到组的最大值(使用最大连接技巧)。这并不难:

SELECT user, SUBSTRING(MAX(CONCAT(LPAD(freq, 6, '0'),pizza)),7) 
FROM 
(SELECT user, pizza, COUNT(*) AS freq 
FROM user_likes 
GROUP BY user, pizza) ilv 
GROUP BY user 
+0

如果表中会有'mixfood pizza'? – Jbsh 2013-03-01 09:57:20

+0

呃?这只是另一个字符串。 – symcbean 2013-03-01 13:40:34

2

让我们一步一步来

以下查询会给你的次数每一个客户订购各种比萨

SELECT name, pizza, COUNT(*) AS cnt 
FROM yourTable 
GROUP BY name, pizza 

那么,我们如何获得最经常从那里订购比萨饼?我们首先要知道什么是比萨的每个客户订购的数量最多

SELECT name, MAX(cnt) AS cnt FROM (
    SELECT name, pizza, COUNT(*) AS cnt 
    FROM yourTable 
    GROUP BY name, pizza 
) AS subquery GROUP BY name 

然后使用这个号码来选择实际的比萨饼名

SELECT name, pizza, COUNT(*) AS cnt 
FROM yourTable AS t 
CROSS JOIN (
    SELECT name, MAX(cnt) AS cnt FROM (
    SELECT name, pizza, COUNT(*) AS cnt 
    FROM yourTable 
    GROUP BY name, pizza 
) AS subquery GROUP BY name 
) AS sq 
USING(name,cnt) 
GROUP BY name, pizza 
+0

'from from子句'中的未知列'cnt' – Jbsh 2013-03-01 09:53:39

+0

是的,错误的别名。立即尝试 – Mchl 2013-03-01 10:04:21

+0

@Jbsh - 如果您从诸如此类的实质性答案中得到错误,最好查看是什么导致错误和“修补程序”一点。这里的答案虽然很好,但应该被视为可以基于您的解决方案的提示。 (+1) – halfer 2013-03-01 14:26:25

-1

让我们有一个简单的解决方案:所有的 首先,我们有两列,名字和食物。 可以列出喜爱的客户的食物容易:

CREATE TEMPORARY TABLE tbltemp AS (
SELECT name, food, COUNT(*) c 
FROM food 
GROUP BY name, food 
); 

现在我们拥有所有的食物通过计数。 然后你就可以通过计数降序排列是:

SELECT * 
FROM tbltemp 
ORDER BY c DESC 

现在你有一个描述客户的喜爱列表。

UPDATE:

而是第二次查询的,取代它:

SELECT tbl1 . * 
FROM (

SELECT name, food, COUNT(*) c 
FROM food 
GROUP BY name, food 
) AS tbl1, (

SELECT name, food, COUNT(*) c 
FROM food 
GROUP BY name, food 
) AS tbl2 
WHERE tbl1.c = tbl2.c 
AND tbl2.name = tbl1.name 
AND tbl2.food = tbl1.food 
AND tbl1.c = (
SELECT c 
FROM tbltemp 
ORDER BY c DESC 
LIMIT 1) 

此查询结果是你的问题的目标。

+0

否 - 这并不解决问题 – symcbean 2013-03-01 13:42:12

+0

你想要什么? – 2013-03-01 13:50:05

+0

阅读这个问题 - 迈克会出现在tbltemp两次 - 不仅仅是他最喜欢的。 – symcbean 2013-03-01 14:02:31