2013-02-27 27 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-约翰