MySQL使用IN来选择那些不是结果的值,包括那些值

时间:2018-01-10 11:49:15

标签: mysql sql

在我的数据集中,每个人都有几个预订。人们可以预订一家或多家公司。我想计算已经与特定2家公司预订但没有任何其他公司预订的客户的预订价值。

数据的存储方式是每个人可以有几行详细说明每家公司的预订价值。

这是我到目前为止所做的:

SELECT b.booked_date, b.price

FROM person p

LEFT JOIN booking b ON p.booking_id = b.id
LEFT JOIN company c ON b.company_id = c.id

WHERE c.name IN (company1, company2)

然而,这只是计算包含company1和company2的每一行的预订值。我想做的是排除任何与公司1和公司2以外的公司预订的人。

2 个答案:

答案 0 :(得分:1)

SELECT p.id
FROM person p
  JOIN booking b ON p.booking_id = b.id
  JOIN company c ON b.company_id = c.id
WHERE c.name IN (company1, company2)
GROUP BY p.id
HAVING COUNT(DISTINCT c.id)=2

该查询返回使用两家指定公司预订的客户。

然后可以在计算中使用查询

SELECT b.booked_date, b.price
FROM person p
  JOIN booking b ON p.booking_id = b.id
  JOIN (the query above) sub ON sub.id=p.id

答案 1 :(得分:0)

StanislavL是对的。但HAVING只有在人们预订了两家公司时才有效。如果条件是“company1或company2之一”,那么我想下一个查询(小心,这是非常慢的查询):

SELECT b.booked_date, b.price
    FROM person p
    LEFT JOIN booking b ON p.booking_id = b.id
    WHERE 
        b.id IN (
            SELECT id 
            FROM booking b1 
            WHERE 
                b1.company_id IN (company1, company2) 
                AND (
                    SELECT COUNT(id) 
                    FROM booking b2 
                    WHERE 
                        b2.id = b1.id 
                        AND b2.company_id NOT IN(company1, company2) = 0
                )
        )