复杂的MySQL查询

时间:2012-03-16 21:44:40

标签: php mysql join

我正在为拍卖网站设置一个新的数据库方案,并尝试向用户发送电子邮件,以查找他们正在寻找的特定商品。我有三张桌子:

auctions

- 用户发布的每个项目都会在此处输入一个条目,其中包含标题,googleID,当前出价等。

alerts

- 这些是由用户设置的,它们包括他们正在寻找的项目的googleID,他们的用户ID,启用的布尔值和时间戳

notifications

- 这会跟踪哪些用户已被提醒有关哪些项目,这样我们就不会在每次运行cron.php时向同一用户提醒相同的项目。包括提醒ID和拍卖ID

所以我正在尝试创建一个选择以下内容的查询:

  • 警告已在alerts表格
  • 中启用
  • alerts表中的googleID与auctions
  • 中的googleID相匹配
  • 拍卖未在auctions表格
  • 中关闭
  • 提醒ID& notifications表中的拍卖ID不在同一行(这是我遇到问题的部分。我需要确保一个拍卖ID可以为其发送多个警报,但从来没有相同的拍卖任何用户多次)

这是我到目前为止的查询,但我真的被困在最后一部分而且我看到了我能想到的所有地方。希望我已经足够解释了,如果有任何澄清会有所帮助并提前感谢,请告诉我!

$sql = "SELECT a.user, b.id, b.title, b.googleimg, b.authors
        FROM alerts a, auctions b, notifications c
        WHERE a.googleID = b.googleid AND a.enabled = 'y' AND b.closed = 0 AND ????";

2 个答案:

答案 0 :(得分:1)

怎么样 -

SELECT
    alerts.user,
    auctions.id,
    auctions.title,
    auctions.googleimg,
    auctions.authors 
FROM alerts   
INNER JOIN auctions
    ON alerts.googleID = auctions.googleID
LEFT JOIN notifications
    ON alerts.alertID = notifications.alertID
    AND auction.auctionID = notifications.auctionID
WHERE alerts.enabled = 'y'
AND auction.closed = 0
AND notifications.alertID IS NULL

答案 1 :(得分:0)

将语法更改为现代JOIN语法

SELECT a.user, b.id, b.title, b.googleimg, b.authors
FROM alerts a  
JOIN auctions b ON b.googleID = a.googleID
JOIN notifications c ON C.auctionID = b.auctionID AND a.alertID<>c.alertID
WHERE a.enabled = 'y' AND b.closed = 0 

前两个表与您正在执行的操作相同。第三个联接会查找与此次竞价相关的所有通知,其中提醒中的alertID尚未位于通知中。