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
- 我不在乎性能或老套的方式
- 有两个以上的频率
- 一个人可以购买房产的时间是固定的(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