【问题标题】:how exclude the query result from three different tables?如何从三个不同的表中排除查询结果?
【发布时间】:2017-09-07 08:50:19
【问题描述】:

我有 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%';

此代码有效,但现在我想排除表 userstransactions 之间具有相同 ref 的报价

这应该工作的方式是:

  • X 国用户在 Y 设备上进入。
  • 用户根据自己的国家和设备选择优惠。
  • 优惠已通过回邮至transactions 进行注册。
  • 用户进入主页后不再看到他已经完成的报价。

现在我能够完成 3 个第一步,但不能完成第四步。有关如何执行此操作的任何帮助?

以下是表格示例: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" 

我希望这能解释一下我正在尝试做的事情

【问题讨论】:

  • offers.offer_id 与 transactions.id 中存储的 id 相同?那么如果有人接受了报价并进行了交易,那么offer_id会存储在交易表中吗?
  • 表格用户和国家是如何关联的?那么如何知道用户来自哪个国家/地区?
  • 添加一些示例表数据和预期结果 - 全部为格式化文本。
  • 附注:您的查询应该使用UNION ALL,而不是UNION,因为没有要检测和删除的重复项(设备不能是“全部”并同时匹配“iphone%”时间)。无论如何,您可以在单个查询中轻松完成此操作:WHERE a.country = 'US' AND (b.device = 'all' OR b.device LIKE 'iphone%')
  • 您应该做的第一件事是整理好您的数据库。您的国家/地区表不包含人们假设的国家/地区,但是,呃,提供?至少我三次看到美国的 ID 恰好是提供 ID 而不是国家 ID。 Transaction 表也包含一个列ID,它似乎又不是一个交易ID,而是一个报价ID。修复你的数据库结构。然后才开始编写查询。

标签: php mysql sql database join


【解决方案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)

【讨论】:

  • 我结束了使用您的解决方案,如下所示:SELECT * FROM countries a INNER JOIN offers b ON a.offer_id = b.offer_id WHERE a.country ='MX' AND (b.device = 'all' OR b.device LIKE 'iPhone%') AND NOT EXISTS (SELECT * FROM transactions t WHERE t.oid = b.offer_Id AND t.user = "ab070c5cb6d1a17714661a30d822ea08")
【解决方案2】:

您可以在事务表中使用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

关于您的问题,我仍然不清楚表 userscountries 是如何连接的。
这是一个重要的细节,因为LEFT OUTER JOIN 应该只从该特定用户那里获取交易。所以条件transactions.user = user.ref也应该添加到join中。

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

【讨论】:

  • userscountries 没有连接,国家有国家 ID "US","MX","UK",etc 和 offer ID 当来自美国的人进入查询搜索在表上countries 的报价ID 为US
  • 之后,查询从表countriesoffers 中搜索所有匹配的商品ID,如下所示:SELECT * FROM countries a INNER JOIN offers b ON a.id = b.offer_id WHERE a.country = 'MX' AND (b.device = 'all' OR b.device LIKE 'iphone%')
  • 当用户以我在桌子上收到的报价结束时transactions 报价 ID 和用作 ID 的用户参考代码
  • 现在我需要执行此操作SELECT * FROM countries a INNER JOIN offers b ON a.id = b.offer_id WHERE a.country = 'MX' AND (b.device = 'all' OR b.device LIKE 'iphone%'),但删除 ID 为 415076 的报价,正如您在交易示例中看到的那样,我在那里有该报价 ID,因为用户已经以该 ID 结束,所以我需要从查询中排除它,所以在示例的最后,您只有 ID 为 415807 的报价
  • 链接我们使用的用户user在桌子上transactionsref在桌子上users
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多