【问题标题】:Combining values of 3 different MySQL table, join table 1 and table 2 and check if table 3 values exist in this join结合 3 个不同 MySQL 表的值,连接表 1 和表 2,并检查表 3 的值是否存在于此连接中
【发布时间】:2016-06-01 10:27:16
【问题描述】:

我有 3 个 MySQL 表来检索它们的数据。

table1 包含以下行:

id | name       | total_amount | product_id | date
---------------------------------------------
1  | some name  | some amount  | some pid   | some date
2  | some name1 | some amount1 | some pid1  | some date1
3  | some name2 | some amount2 | some pid2  | some date2
4  | some name3 | some amount3 | some pid3  | some date3

和表2:

product_id | product_name
-------------------
some pid   | some product name
some pid1  | some product name1
some pid2  | some product name2
some pid3  | some product name3

和表3:

id | total_amount  | product_id
-------------------------------
1  | some amount   | some pid 
2  | some amount2  | some pid2 

我在 table1 和 table 2 之间使用内部联接及其 product_id 来列出如下值:

name       | total_amount | product_id | product_name        | date
--------------------------------------------------
some name  | some amount  | some pid   | some product name   | some date
some name1 | some amount1 | some pid1  | some product name1  | some date1
some name2 | some amount2 | some pid2  | some product name2  | some date2
some name3 | some amount3 | some pid3  | some product name3  | some date3

但是,如果 table3 的 total_amount 和 product_id 与 table1 的 total_amount 和 product_id 具有相同的值,我不想在连接表列表中显示行。

所以我希望我的输出是这样的:

name       | total_amount | product_id | product_name        | date
--------------------------------------------------
some name1 | some amount1 | some pid1  | some product name1  | some date1
some name3 | some amount3 | some pid3  | some product name3  | some date3

是否可以使用 SQL Query 执行此操作,或者我应该尝试使用我的客户端语言 PHP 执行此操作?

【问题讨论】:

  • Join Query 在哪里?应该是table3 join colum IS NULL

标签: php mysql sql


【解决方案1】:

你可以使用以下查询:

SELECT t1.*, t2.*
FROM table1 AS t1
JOIN table2 AS t2 ON t1.product_id = t2.product_id 
LEFT JOIN table3 AS t3 ON t3.product_id = t2.product_id AND t1.total_amount = t3.total_amount
WHERE t3.product_id IS NULL

上述查询在字段product_id 上连接table1table2 并过滤掉记录,以防table3 中存在具有相同product_idtotal_amount 值的匹配记录。

【讨论】:

    【解决方案2】:

    直接的方法是使用NOT EXISTSNOT IN

    select t1.name, t1.total_amount, t1.product_id, t2.product_name, t1.date
    from t1
    join t2 on t2.product_id = t1.product_id
    where (t1.total_amount, t1.product_id) not in
    (
      select t3.total_amount, t3.product_id
      from t3
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2021-07-29
      • 2018-03-05
      • 1970-01-01
      • 2015-03-24
      • 2016-08-31
      • 1970-01-01
      相关资源
      最近更新 更多