0

私はこのデータを持つテーブルを持っています:

 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

クライアントが多くのピザで同じ数量を持っている場合、結果は任意のピザの名前になる可能性があります。

4

3 に答える 3

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
于 2013-03-01T09:45:00.633 に答える
0

ユーザーとピザごとにカウントをグループ化し、これをグループごとの最大値を見つけるクエリのデータソースとして使用します (max concat トリックを使用)。それは難しいことではありません:

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
于 2013-03-01T09:42:52.500 に答える
-1

簡単な解決策を見てみましょう: まず、name と food の 2 つの列があります。お気に入りの顧客の食べ物を簡単にリストできます:

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

これで、カウントごとにすべての食品が揃いました。次に、降順で並べ替えることができます。

SELECT *
FROM tbltemp
ORDER BY c DESC

これで、顧客のお気に入りを説明するリストができました。

アップデート :

2 番目のクエリの代わりに、次のクエリを置き換えます。

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 )

このクエリ結果が質問の目標です。

于 2013-03-01T11:21:24.413 に答える