【问题标题】:MySQL - Joining table on itself based on criteria from other tableMySQL - 根据其他表的条件在自身上加入表
【发布时间】:2017-09-14 21:06:16
【问题描述】:

这是我要解决的问题:

Table1 具有产品 ID、日期和这些日期的价格,Table2 具有产品属性。

我希望能够根据一组属性在同一日期为客户比较不同产品的价格。我很容易获得“简单”产品和“高级”产品的产品/日期/价格列表(见下文)。

我希望能够连接这两个表,使输出看起来像:

[客户] [产品] [日期] [SIM_PROD] [SIM_PRICE] [ADV_PROD] [ADV_PRICE]

这是我做到的

SELECT b.NAME AS ‘CLIENT’, a.NAME AS ‘SIMPLE_PRODUCT’, t1.DATE AS ‘DATE’, t1.PIVOT_PRICE AS ‘SIMPLE_PRICE’
FROM TABLE1 t1
LEFT JOIN PRODUCT a
ON t1.PRODUCT_ID = a_PRODUCT_ID
LEFT JOIN CLIENTS b
ON a.PARTNER_ID = b.PARTNER_ID
WHERE a.CRITERIA = TRUE;


SELECT b.NAME AS ‘CLIENT’, a.NAME AS ‘ADV_PRODUCT’, t2.DATE AS ‘DATE’, t2.PIVOT_PRICE AS ‘ADV_PRICE’
FROM TABLE1 t2
LEFT JOIN PRODUCT a
ON t2.PRODUCT_ID = a_PRODUCT_ID
LEFT JOIN CLIENTS b
ON a.PARTNER_ID = b.PARTNER_ID
WHERE a.CRITERIA = FALSE;

我已经能够构建类似的表,我从 TABLE1 中提取价格并将其标记为 t1,然后再次从 TABLE1 中提取价格并将其标记为 t2,但仅在使用 TABLE1 中的标准时,而不是表中的标准需要加入。

是否可以先“设置”一个表(例如简单),然后“设置”第二个表(例如高级),然后在 PARTNER_ID 和 DATE 上加入它们?

【问题讨论】:

  • 如果这两个查询是两个不同的表,您可以使用哪些字段或字段将一个表与另一个表关联?换句话说,您根据哪些标准形成您想要作为输出的新记录。
  • 对于客户、产品和日期的每个组合,您有多少条具有相同条件值的记录?我建议您提供示例数据和所需的结果。
  • 你不能在 MySQL 中使用大引号。列名应该用反引号引起来。

标签: mysql join


【解决方案1】:

你可以加入两个子查询:

SELECT t1.client, t1.date, t1.simple_product, t1.simple_price, t2.adv_product, t2.adv_price
FROM (
    SELECT b.NAME AS CLIENT, a.NAME AS SIMPLE_PRODUCT, t1.DATE, t1.PIVOT_PRICE AS SIMPLE_PRICE
    FROM TABLE1 t1
    LEFT JOIN PRODUCT a
    ON t1.PRODUCT_ID = a_PRODUCT_ID
    LEFT JOIN CLIENTS b
    ON a.PARTNER_ID = b.PARTNER_ID
    WHERE a.CRITERIA = TRUE
) AS t1
JOIN (
    SELECT b.NAME AS CLIENT, a.NAME AS SIMPLE_PRODUCT, t1.DATE, t1.PIVOT_PRICE AS SIMPLE_PRICE
    FROM TABLE1 t1
    LEFT JOIN PRODUCT a
    ON t1.PRODUCT_ID = a_PRODUCT_ID
    LEFT JOIN CLIENTS b
    ON a.PARTNER_ID = b.PARTNER_ID
    WHERE a.CRITERIA = FALSE
) AS t2
ON t1.client = t2.client AND t1.date = t2.date

您可能需要选择其他条件并将它们添加到ON 条件中。否则,这将在具有相同客户和日期的所有产品之间产生完全交叉产品。

您想要的输出有一个额外的PRODUCT 列,但我看不出它来自哪里。

【讨论】:

  • 这非常有效,正是我想要的——非常感谢!
  • 如果它解决了问题,你应该接受答案
猜你喜欢
  • 2013-03-24
  • 2019-03-19
  • 2015-03-28
  • 1970-01-01
  • 2013-07-02
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多