【发布时间】:2017-09-07 08:50:19
【问题描述】:
我有 3 张桌子 offers countries 和 transactions,我想做的是从特定国家和设备中提取优惠,我已经用这个公式做到了:
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%';
此代码有效,但现在我想排除表 users 和 transactions 之间具有相同 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