4

人が物件を購入した回数を指定するこの表を考えてみましょう。

+--------+----------+
|  user  | property |
+--------+----------+
| john   | car      |
| john   | car      |
| john   | house    |
| peter  | car      |
| peter  | car      |
| amanda | house    |
| amanda | house    |
+--------+----------+

車を一度購入した回数、家を一度購入した回数などを知る必要があります。

+----------+---+---+
| property | 1 | 2 |
+----------+---+---+
| cars     | 4 | 2 |
| house    | 3 | 1 |
+----------+---+---+
  • 車は何回購入されましたか?4つ、ピーター用に2つ、ジョン用に2つ。
  • 車を2回購入したのは何回ですか。同じ人のために、2つ。
  • 家は何回購入されましたか?3つ、アマンダ用に2つ、ジョン用に1つ。
  • 家を2回購入したのは何回ですか。一度だけ、アマンダのために

これは、SQLクエリのみを使用してこれを行うことは可能ですか?

  • 私はパフォーマンスやハックの方法を気にしません。
  • 3つ以上の周波数があります。
  • 人が物件を購入できる時間は決まっているので(5)、クエリで列を手動で指定することは問題ありません。つまり、次のようなことをしても問題はありません。

    SELECT /* ... */ AS 1, /* ... */ AS 2, /* ... */, AS 3 /* ... */
    
4

7 に答える 7

1

フォローしてみてください。

SELECT COUNT(TABLE1.PROPERTY) AS COUNT, PROPERTY.USER FROM TABLE1
INNER JOIN (SELECT DISTINCT PROPERTY, USER FROM TABLE1) AS PROPERTY
ON PROPERTY.PROPERTY = TABLE1.PROPERTY
AND PROPERTY.USER = TABLE1.USER
GROUP BY TABLE1.USER, PROPERTY.PROPERTRY

MySQLで同様にテスト済み

于 2013-02-27T01:25:03.893 に答える
1
SELECT DISTINCT @pr := prop,
    (SELECT COUNT(1) FROM tbl WHERE prop = @pr LIMIT 1),
    (SELECT COUNT(1) FROM 
        (SELECT *, COUNT(*) cnt
        FROM tbl
        GROUP BY usr, prop
        HAVING cnt = 2) as tmp
        WHERE `tmp`.prop = @pr LIMIT 1)
FROM tbl;

はい、それは最善の方法ではありません。しかしねえ、あなたは望むように答えを得る。

また、テーブル内のあらゆる種類のプロパティの結果が生成されます。

フィドルリンクはここにあります

PS:60回O_Oを試す

于 2013-02-27T00:52:35.730 に答える
1

あなたが質問を投稿したので、私はここにいます。良いもの...
これは、グループとカウントだけで、あなたが要求したとおりにそれを行う方法です。
秘訣は、user列とproperty列を連結して、それぞれに一意の「id」を生成することです。購入数とは関係なく機能するはずです。

SELECT C.`property`, COUNT(C.`property`), D.`pcount` from `purchases` C
LEFT JOIN(
  SELECT A.`property`, B.`pcount` FROM `purchases` A
  LEFT JOIN (
    SELECT `property`,
           CONCAT(`user`, `property`) as conc,
           COUNT(CONCAT(`user`, `property`)) as pcount
    FROM `purchases` GROUP BY CONCAT(`user`, `property`)
  ) B
  ON A.`property` = B.`property`
  GROUP BY B.pcount
) D
ON C.`property` = D.`property`
GROUP BY C.`property`
于 2013-02-27T01:18:04.603 に答える
1

SQLフィドル

MySQL 5.5.30スキーマのセットアップ

CREATE TABLE Table1
    (`user` varchar(6), `property` varchar(5))
;

INSERT INTO Table1
    (`user`, `property`)
VALUES
    ('john', 'car'),
    ('john', 'car'),
    ('john', 'house'),
    ('peter', 'car'),
    ('peter', 'car'),
    ('amanda', 'house'),
    ('amanda', 'house')
;

クエリ1

select t.property, t.total, c1.cnt as c1, c2.cnt as c2, c3.cnt as c3
from
  (select 
    t.property , 
    count(t.property) as total
  from Table1 t
  group by t.property
  ) as t
  left join (
      select property, count(*) as cnt
      from (
          select 
            property, user, count(*) as cnt
          from table1
          group by property, user
          having count(*) = 1
        ) as i1
      group by property
  ) as c1 on t.property = c1.property
  left join (
      select property, count(*) as cnt
      from (
          select 
            property, user, count(*) as cnt
          from table1
          group by property, user
          having count(*) = 2
        ) as i2
      group by property
  ) as c2 on t.property = c2.property
  left join (
      select property, count(*) as cnt
      from (
          select 
            property, user, count(*) as cnt
          from table1
          group by property, user
          having count(*) = 3
        ) as i3
      group by property
  ) as c3 on t.property = c3.property

結果

| PROPERTY | TOTAL |     C1 | C2 |     C3 |
-------------------------------------------
|      car |     4 | (null) |  2 | (null) |
|    house |     3 |      1 |  1 | (null) |
于 2013-02-27T01:19:49.460 に答える
0

これを試して

    SELECT property , count(property) as bought_total , count(distinct(user)) bought_per_user
    FROM Table1
    GROUP BY property

出力は次のようになります

  PROPERTY  |   BOUGHT_TOTAL     |  BOUGHT_PER_USER
  ________________________________________________________
    car     |            4       |       2
    house   |            3       |       2

デモSQLフィドルはこちら

于 2013-02-27T00:24:28.410 に答える
0

副選択でこれを行うことができるはずです。

SELECT property, user, COUNT(*) FROM purchases GROUP BY property, user;

必要なグループ化されたデータの完全なセットが返されます。次に、さまざまな周波数を確認する必要があります。

SELECT property, freq, COUNT(*) FROM (SELECT property, user, COUNT(*) freq FROM purchases GROUP BY property, user) AS foo GROUP BY property, freq;

あなたが説明した形式ではありませんが、データを返します

于 2013-02-27T00:35:22.930 に答える
0

これがお役に立てば幸いです。最初に1つのテーブルを作成しましょう。

テーブルprop(user varchar(max)、property varchar(max))を作成します

小道具の値に挿入('john'、'car')、小道具の値に挿入('john'、'car')、小道具の値に挿入('john'、'house')、小道具の値に挿入('peter' 、'車両')、

小道具の値に挿入('peter'、'car')、小道具の値に挿入('amanda'、'house')、小道具の値に挿入('amanda'、'house')

1)車は何回購入されましたか?

ANS:propからcount(property)を選択します。ここでproperty ='car'(4)

2)車を2回購入した回数は?

ANS:propからuser、COUNT(property)を選択します。ここで、property ='car'は、COUNT(property)=2のユーザーによってグループ化されます。

2-ジョン2-ピーター

3)家は何回購入されましたか?

ANS:propからCOUNT(property)を選択します。ここでproperty ='house'(3)4)家が2回購入された回数は?ANS:propからuser、COUNT(property)を選択します。ここで、property ='house'は、COUNT(property)<= 22-amanda1-johnを持つユーザーによってグループ化されます。

于 2013-02-27T06:35:31.307 に答える