1

我有2张桌子。一个被称为subscriptions,另一个被称为service_sushi_service。我正在尝试获取所有具有 2 种以上不同的手机service_id。例如。

phone: 12345 service id: 12 
phone: 12345 service id: 12 
phone: 12345 service id: 8
phone: 12345 service id: 8
phone: 12345 service id: 13
phone: 22222 service id: 13
phone: 22333 service id: 3

我需要将其输出为 phone=12345,occurrences=3

这就是我到目前为止所得到的:我不知道如何走得更远。

SELECT 
    `sub`.`phone` AS `phone`
FROM 
    `subscriptions` AS `sub`
LEFT JOIN `service_sushi_service` `sushi_service` ON `sushi_service`.`sushi_service_id` = `sub`.`sushi_service_id`
WHERE 
    date(`sub`.`added`) >= '2013-01-01'
GROUP BY `sub`.`phone`
4

3 回答 3

4
SELECT 
    `sub`.`phone` AS `phone`,
    COUNT(`sushi_service`.`sushi_service_id`) as occurences        
FROM 
    `subscriptions` AS `sub`
LEFT JOIN `service_sushi_service` `sushi_service` ON `sushi_service`.`sushi_service_id` = `sub`.`sushi_service_id`
WHERE 
    date(`sub`.`added`) >= '2013-01-01'
GROUP BY `sub`.`phone`
HAVING occurences > 2

编辑:应该指出,HAVING 似乎只是 MySQL 的一种东西. 以为我会发布这个供您参考 - http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

于 2013-07-08T12:59:34.490 回答
3

我在这段代码中看到了两件事:

  1. 你为什么要这样做LEFT JOIN?我会说你需要一个直的INNER JOIN

  2. 可以count(distinct field_name)用来获取对应的值。

因此 SQL 可能如下所示:

SELECT 
    `sub`.`phone` AS `phone`,
     count(distinct `sushi_service`.`sushi_service_id`) as `occurrences`
FROM 
    `subscriptions` AS `sub`
JOIN `service_sushi_service` `sushi_service` ON `sushi_service`.`sushi_service_id` = `sub`.`sushi_service_id`
WHERE 
    date(`sub`.`added`) >= '2013-01-01'
GROUP BY `sub`.`phone`
HAVING `occurrences` > 2
于 2013-07-08T12:59:53.040 回答
1

完全不需要join

select s1.phone, count(s1.*) from 
    (select unique phone, sushi_service_id from subscriptions) s1
group by s1.phone having count(s1.*) > 2
于 2013-07-08T13:07:17.967 回答