Mysql 计算多个值的不同行数 我们考虑一下这张表,说明一个人买了多少次房产。< /P> +--------+----------+ | user | property | +--------+----------+ | john | car | | john | car | | john | house | | peter | car | | peter | car | | amanda | house | | amanda | house | +--------+----------+

Mysql 计算多个值的不同行数 我们考虑一下这张表,说明一个人买了多少次房产。< /P> +--------+----------+ | user | property | +--------+----------+ | john | car | | john | car | | john | house | | peter | car | | peter | car | | amanda | house | | amanda | house | +--------+----------+,mysql,sql,distinct,Mysql,Sql,Distinct,我需要知道一辆车买了多少次,一栋房子买了多少次,等等,像这样的: +----------+---+---+ | property | 1 | 2 | +----------+---+---+ | cars | 4 | 2 | | house | 3 | 1 | +----------+---+---+ 一辆车买了多少次四个,两个给彼得,两个给约翰 一辆车买了两次有多少次两个,为同一个人 一栋房子买了多少次三个,两个给阿曼达,一个给约翰 一栋房子买了两次有多少次?仅一次,对于am

我需要知道一辆车买了多少次,一栋房子买了多少次,等等,像这样的:

+----------+---+---+
| property | 1 | 2 |
+----------+---+---+
| cars     | 4 | 2 |
| house    | 3 | 1 |
+----------+---+---+
  • 一辆车买了多少次四个,两个给彼得,两个给约翰
  • 一辆车买了两次有多少次两个,为同一个人
  • 一栋房子买了多少次三个,两个给阿曼达,一个给约翰
  • 一栋房子买了两次有多少次?仅一次,对于amanda
只有使用SQL查询才能做到这一点吗?

  • 我不在乎性能或老套的方式
  • 有两个以上的频率
  • 一个人可以购买房产的时间是固定的(5),因此在查询中手动指定列是没有问题的。我的意思是这样做没有问题:

    SELECT /* ... */ AS 1, /* ... */ AS 2, /* ... */, AS 3 /* ... */
    
试试这个

    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

您应该能够使用子选择来完成此操作

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;
它的格式与您演示的不完全相同,但它返回数据

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;
是的,这不是最好的方法;但是,嘿,你得到了想要的答案

此外,它还将生成表中任何类型属性的结果

小提琴链接


附言:60次尝试O_O

自从你发布问题后,我就在这里。好的…
这里有一种方法可以完全按照您的要求进行,只需分组和计数。
诀窍是我将用户列和属性列连接起来,为每一列生成一个唯一的“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`

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')
;
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) |
查询1

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')
;
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) |

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')
;
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) |
你可以试试下面的

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中进行了类似的测试

我希望这能帮助您…..让我们先创建一个表:

创建表属性(用户varchar(最大值),属性varchar(最大值))

插入道具值('john','car'),插入道具值('john','car'), 插入道具值('john','house'),插入道具值('peter','car')

插入道具值('peter','car'),插入道具值('amanda','house'), 插入道具值('amanda'、'house')

1) 这辆车买了多少次

回答:从属性为'car'的道具中选择计数(属性) (四)

2) 一辆车买了两次有多少次

ANS:选择用户,从属性=‘汽车’组中按用户计数(属性) 具有计数(属性)=2

2-john 2-彼得

3) 一栋房子买了多少次

ANS:从prop中选择COUNT(property),其中property='house' (3) 4) 一栋房子买了两次有多少次? ANS:按用户从prop where property='house'组中选择用户、计数(属性) 计数(属性)<=2 2-阿曼达
1-john

谢谢您抽出时间。这给了我不同用户购买房产的次数,但这不是我想要的。请注意,结果表与示例输出表不同。这太棒了!不过需要注意的是,它告诉我某个用户购买房产的次数。例如,如果amanda买了另一栋房子,那么一栋房子被买两次的次数将为0(即使amanda之前买了两次房子)。尽管如此,距离足够近,它仍然非常有用。如果没有其他弹出窗口,这就是正确答案。您可以将
具有cnt=2
更改为
具有cnt>=2
。或增加另一条款;其中设置cnt=3将给出所有三次购买的产品:P