MySQL查询以查看哪些行没有对应的行

时间:2013-04-09 12:10:47

标签: mysql distinct

我需要选择尚未审核完成预订的用户的电子邮件。 我当然希望每个预订不超过一封尚未经过审核的电子邮件,这就是问题所在。我曾尝试选择DISTINCT bid(b.bid和r.booking_id是要查找的数字)以及GROUP BY解决方案,但它们都没有工作。

他们仍然可能是解决方案,但我无法让它发挥作用。例如,在我的数据库中仅使用两条评论进行测试,其中bid和booking_id不匹配,我会在同一预订中获得两行:

username bid booking_id
mail@mail.mail 9 8
mail@mail.mail 9 45

这是我上次运行以解决问题的查询,但正如您在上面看到的结果是相同的。我错在哪里?提前谢谢。

SELECT u.username, b.bid, r.booking_id
FROM users u, reviews r, bookings b
WHERE u.id = b.id_booker
AND b.status =  'FINISHED'
AND b.bid NOT IN (SELECT booking_id FROM reviews WHERE 1)

编辑:三个表的结构 - 仅相关的列名

Users TABLE 
id           // - auto increment value
email        // The emails to which I will send reminders if no review has been posted

Reviews TABLE
rid          // - auto increment value
booking_id   // ID of the booking to which the review refers (bookings.bid)
id_author    // ID of the user who wrote the review (users.id)

Bookings TABLE
bid          // ID of the booking (reviews.booking_id) - auto increment value
id_booker    // ID of the user who made the booking (users.id)
status       // Only looking for finished bookings in this query

1 个答案:

答案 0 :(得分:0)

您可以先从Bookings.id_booker中选择所有ID。 然后从已经提交评论的用户中减去id。

SELECT id_booker
FROM Bookings
WHERE id_booker NOT IN ( 
    SELECT id_author
    FROM Reviews
)

这样可以获得所有未提交评论的用户的身份证明。

最后一步是获取这些用户的电子邮件地址。

SELECT DISTINCT email
FROM Bookings
INNER JOIN Users ON Users.id = Bookings.id_booker
WHERE id_booker NOT IN ( 
    SELECT id_author
    FROM Reviews
)

我更喜欢只使用子查询,因为您只需要Users表中的数据。 但MySQL在子查询方面存在严重的性能问题,因此这可能是一个很好的解决方案。