2013-02-27 41 views
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 | 
+----------+---+---+ 
  • 多少次賽車買? ,兩個彼得和兩個約翰
  • 一輛車買了兩次多少次? 兩個,爲同樣的傢伙。
  • 多少次房子是買? ,二爲阿曼達和一次約翰
  • 房子買了兩次多少次?只有一次,爲阿曼達

這是可能做到這一點只使用SQL查詢?

  • 我不在乎表現或駭人的方式。
  • 有兩個以上的頻率。
  • 有一組固定的時間一個人可以買房(5),所以它不是問題查詢手動指定的列。我的意思是有沒有問題,做這樣的事情:

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

回答

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; 

是的,這是不是最好的方法;但是,嘿,你會根據需要得到答案。

此外,它會產生爲表任何種類的財產的結果。

小提琴鏈接lies here

上限:60次嘗試O_O

+0

太棒了!但是有一點需要注意的是,它告訴我某個用戶購買了一個房產的次數。例如,如果** amanda **購買另一棟房屋,則房屋被購買**兩次的次數將爲0(即使阿曼達之前兩次買了房子)。 仍然,足夠接近,它仍然非常有用。如果沒有別的東西出現,這是正確的答案。 – Veehmot 2013-02-27 01:04:35

+1

您可以將'HAVING cnt = 2'更改爲'HAVING cnt> = 2'。或添加另一個條款;在那裏設置'HAVING cnt = 3'會給所有買過的人三倍。 :P – hjpotter92 2013-02-27 01:07:30

+0

工作得很好,非常感謝! – Veehmot 2013-02-27 01:09:54

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 

DEMO SQL FIDDLE HERE

+0

感謝您的時間。這讓我有多少次不同的用戶購買了一個房產,但這不是我正在尋找的。請注意,結果表與示例輸出表不同。 – Veehmot 2013-02-27 00:28:40

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; 

它不是相當的格式,你說明,但它返回的數據

1

我在這裏因爲您發佈了問題。好的一個......
這是一種完全按照您的要求完成的方法,只需要組和計數。
訣竅是我將用戶和屬性列連接起來,爲每個列產生一個唯一的「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` 
1
SQL Fiddle

MySQL的30年5月5日架構設置

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 

Results

| PROPERTY | TOTAL |  C1 | C2 |  C3 | 
------------------------------------------- 
|  car |  4 | (null) | 2 | (null) | 
| house |  3 |  1 | 1 | (null) | 
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測試類似

0

我希望這能幫助ü.....讓我們創建一個表第一:

創建表的道具(用戶VARCHAR(最大值),物業VARCHAR( max))

插入prop值('john','car'),插入prop值('john','car'), 插入prop值('john','house'),插入道具值('彼得','汽車'),

('amanda','house')插入道具值('amanda','house'),

1)如何插入道具值('peter','car')很多時候買車?

ANS:SELECT COUNT(財產)的道具,其中財產= '車' (4)

2)有多少次車是買了兩次?

ANS:選擇用戶,COUNT(屬性)從丙其中property = '汽車' 由用戶 組具有COUNT(屬性)= 2

2-約翰 2-彼得

3)如何很多時候買了房子?

ANS:select PROPT(property)from property where'property' (3) 4)房子買了兩次多少次? ANS:選擇用戶,COUNT(屬性)從丙其中property = '房子' 由用戶 組具有COUNT(屬性)< = 2 2-阿曼達 1-約翰