【问题标题】:MySql - LEFT JOIN on preference but have no duplicatesMySql - 左加入偏好但没有重复
【发布时间】:2016-06-21 19:43:24
【问题描述】:

所以我必须将一个表连接到另一个表的值上,但是它应该只从连接的表中返回 1 个值。
这些表的关系非常模糊——我正在处理的数据的性质也是如此。 “Cookies”表中的名称可以是CookieAttr1CookieAttr2CookieAttr3 之一。

Cookies
|-----------------------------|
| CookieName  | CookieValue   |
|-------------+---------------|
| Choc-Chip   | 1200          |
| Dough       | 500           |
|-----------------------------|

CookieColor
|-----------------------------------------------------------------|
| Id  | CookieAttr1   | CookieAttr2   | CookieAttr3   | Color     |
|-----+---------------+---------------+---------------+-----------|
| 1   |               | Choc-Chip     | Dough         | Red       |
| 2   |               | Choc-Chip     | Crumbs        | Orange    |
| 3   |               | Sultanas      | Dough         | Red       |
| 4   |               | Choc-Chip     | Dough         | Blue      |
| 5   | Dough         |               | Rounded       | Purple    |
| 6   | Dough         | Big           | Rounded       | Green     |
| 7   | Rounded       |               | Rounded       | Pink      |
|-----------------------------------------------------------------|

到目前为止,表是按偏好加入的 - 如果CookieAttr1 为空,它将加入CookieAttr2,然后加入CookieAttr3(它总是有一个值)

SELECT 
    CookieName,
    CookieValue,
    Color
FROM Cookies
LEFT OUTER JOIN (
    SELECT 
        Color,
        CookieAttr1,
        CookieAttr2,
        CookieAttr3
    FROM CookieColor
    GROUP BY CookieAttr3
) CookieColor
    ON COALESCE(CookieAttr1, CookieAttr2, CookieAttr3) = CookieName

出现的问题是,表可以返回重复项,因为按 CookieAttr3 分组可能有多个相同的 CookieAttr2 值,它正在加入。

CookieColor (GROUPED BY `CookieAttr3`)
|-----------------------------------------------------------------|
| Id  | CookieAttr1   | CookieAttr2   | CookieAttr3   | Color     |
|-----+---------------+---------------+---------------+-----------|
| 1   |               | Choc-Chip     | Dough         | Red       |
| 2   |               | Choc-Chip     | Crumbs        | Orange    |
| 5   | Dough         |               | Rounded       | Purple    |
|-----------------------------------------------------------------|

==========> result of query
|-----------------------------------------|
| CookieName  | CookieValue   | Color     |
|-------------+---------------+-----------|
| Choc-Chip   | 1200          | Red       |
| Choc-Chip   | 1200          | Orange    |
| Dough       | 500           | Purple    |
|-----------------------------------------|

==========> Preferred Result
|-----------------------------------------|
| CookieName  | CookieValue   | Color     |
|-------------+---------------+-----------|
| Choc-Chip   | 1200          | Red       |
| Dough       | 500           | Purple    |
|-----------------------------------------|

我怎样才能只获得“Choc-Chip”的一个值?

【问题讨论】:

  • 你想保留Choc-Chip这两条记录中的哪一条,这背后的逻辑是什么?
  • 不清楚这是当前结果还是您的预期结果。我们两者都需要。
  • @Tim_Biegeleisen 巧克力片记录之一。只要颜色一致,颜色就不是那么重要。

标签: mysql duplicates left-join


【解决方案1】:

您始终可以在一个子查询中使用COALESCE,但您的分组不明确

SQL Fiddle Demo

SELECT CookieAttr, Color, CookieValue
FROM 
    (
      SELECT `Id`, 
              COALESCE(CookieAttr1, CookieAttr2, CookieAttr3) CookieAttr,        
              `Color`
      FROM CookieColor        
    ) C
JOIN  Cookies 
  ON C.CookieAttr = Cookies.CookieName

输出

但不知道你想要什么group by

| CookieAttr |  Color | CookieValue |
|------------|--------|-------------|
|  Choc-Chip | Orange |        1200 |
|  Choc-Chip |   Blue |        1200 |
|  Choc-Chip |    Red |        1200 |
|      Dough | Purple |         500 |
|      Dough |  Green |         500 |

如果你添加

GROUP BY CookieAttr;            

但颜色会随机。

| CookieAttr |  Color | CookieValue |
|------------|--------|-------------|
|  Choc-Chip | Orange |        1200 |
|      Dough | Purple |         500 |

【讨论】:

  • 当然逻辑是错误的!需要先解析名称,然后根据结果分组。你的回答对我的大脑袋屁很有帮助。
猜你喜欢
  • 2017-08-22
  • 2022-01-23
  • 2021-04-03
  • 1970-01-01
  • 2012-10-24
  • 2019-12-04
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多