MySql - 首选 LEFT JOIN 但没有重复项
MySql - LEFT JOIN on preference but have no duplicates
所以我必须将 table 连接到另一个 table 的值上,但是它应该只 return 连接的 table.[=30= 中的 1 个值]
这些 table 的关系非常模糊——我正在处理的数据的性质也是如此。 “'Cookies'”中的名称 table 可以是 CookieAttr1
、CookieAttr2
或 CookieAttr3
.
之一
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 |
|-----------------------------------------------------------------|
到目前为止,table 是按偏好加入的 - 如果 CookieAttr1
为 null,它将加入 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
出现问题 table 可以 return 重复,因为按 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' 的一个值?
您始终可以在一个子查询中使用 COALESCE
,但您的分组依据不明确
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 |
所以我必须将 table 连接到另一个 table 的值上,但是它应该只 return 连接的 table.[=30= 中的 1 个值]
这些 table 的关系非常模糊——我正在处理的数据的性质也是如此。 “'Cookies'”中的名称 table 可以是 CookieAttr1
、CookieAttr2
或 CookieAttr3
.
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 |
|-----------------------------------------------------------------|
到目前为止,table 是按偏好加入的 - 如果 CookieAttr1
为 null,它将加入 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
出现问题 table 可以 return 重复,因为按 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' 的一个值?
您始终可以在一个子查询中使用 COALESCE
,但您的分组依据不明确
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 |