如何从三个不同的表中排除查询结果?

时间:2017-09-07 08:50:19

标签: php mysql sql database join

我有3个表offers countriestransactions,而我正在尝试从特定国家和设备中提取优惠,我已经使用以下公式执行此操作:

   SELECT
    *
FROM countries a
INNER JOIN offers b ON a.id = b.offer_id
WHERE a.country = "US"
      AND b.device = 'all'
UNION
SELECT
    *
FROM countries a
INNER JOIN offers b ON a.id = b.offer_id
WHERE a.country = "US"
      AND b.device LIKE 'iphone%';

此代码有效但现在我想在表refusers

之间排除相同transactions的商品

这应该起作用的方式是:

  • 来自X国家/地区的用户在Y设备上输入。
  • 用户根据自己的国家/地区和设备选择优惠。
  • 优惠已通过邮寄方式注册回transactions
  • 用户进入主页面,不再看到他已完成的优惠。

现在我能够完成3个步骤但不是第4个步骤。有关如何做到的任何帮助?

以下是表格的示例:SQL Fiddle

提前致谢

修改

如果我把所有这些都放在单词上会是这样的:

Select all from *offers* where the **offer_id** match with **ID** from *countries* with the **country** "US" and also from *offers* have the **device** "iPhone" now exclude from *transactions* the offers with the **user** = "xxxxx" 

我希望这能解释一下我正在尝试做什么

2 个答案:

答案 0 :(得分:1)

无法查看查询是如何用户特定的,但是要排除您可以使用NOT EXISTS的交易所引用的要约

SELECT * 
FROM countries a 
INNER JOIN offers b ON a.id=b.offer_id 
WHERE a.country="US" AND b.device = 'all' 
  AND NOT EXISTS (SELECT 1 FROM transactions t WHERE t.offer = b.offer_Id)

答案 1 :(得分:0)

您可以使用LEFT OUTER JOIN来解决交易表 我在WHERE子句中添加了t.id IS NULL。因此,您的结果只会显示没有交易的优惠。

          SELECT * 
            FROM countries a 
      INNER JOIN offers b 
              ON a.id = b.offer_id 
 LEFT OUTER JOIN transactions t
              ON t.id = b.offer_id
           WHERE a.country = "US"
             AND t.id IS NULL

关于你的问题,我仍然不清楚表格users和& countries已关联。
这是一个重要的细节,因为LEFT OUTER JOIN应该只从这个特定用户那里获取交易。因此条件transactions.user = user.ref也应该添加到连接中。

每当您向我解释此链接时,都会更新答案