我需要选择尚未审核完成预订的用户的电子邮件。 我当然希望每个预订不超过一封尚未经过审核的电子邮件,这就是问题所在。我曾尝试选择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
答案 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在子查询方面存在严重的性能问题,因此这可能是一个很好的解决方案。