Используйте CASE THEN в SQL - PullRequest
0 голосов
/ 27 мая 2019

У меня есть три таблицы, которые я хочу запросить в MySQL следующим образом:

Примечания к таблице

id  | note
-------------------
1   | note 1
2   | note 2

Индексы таблицы

id  | name
-----------
1   | height
2   | weight
3   | other

Детали таблицы

  note_id    |  indices_id |  value
-------------------------------------
    1        |     1       |   50
    1        |     2       |   60
    1        |     3       |   20
    2        |     1       |   40
    2        |     2       |   10
    2        |     3       |   50

Мне нужно запросить результат следующим образом:

  indices.name    |  note_id = 1 |  note_id = 2
------------------------------------------------
    height        |     50       |   40
    weight        |     60       |   10
    other         |     20       |   50

Я пробовал этот запрос:

SELECT i.name,
(CASE WHEN d.note_id = 1 THEN d.value END) as Col2,
(CASE WHEN d.note_id = 2 THEN d.value END) as Col3
FROM notes n,indices i,detail d
WHERE n.id = d.note_id AND i.id = d.indices_id
GROUP BY i.name

Но столбец Col3 результат равен null
Любая помощь высоко ценится!Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 27 мая 2019

Вам нужно использовать функцию агрегирования, чтобы вы не получали случайные данные строк для Col2 и Col3.MAX будет работать, так как будет игнорировать значения NULL, если note_id не совпадает.Кроме того, вы должны использовать явный синтаксис JOIN:

SELECT i.name,
       MAX(CASE WHEN d.note_id = 1 THEN d.value END) as Col2,
       MAX(CASE WHEN d.note_id = 2 THEN d.value END) as Col3
FROM notes n
JOIN detail d ON n.id = d.note_id
JOIN indices i ON i.id = d.indices_id
GROUP BY i.name

Вывод:

name    Col2    Col3
height  50      40
other   20      50
weight  60      10

Демонстрация на dbfiddle

0 голосов
/ 27 мая 2019

Это вариант ответа Ника. От JOIN до nodes является избыточным:

SELECT i.name,
       MAX(CASE WHEN d.note_id = 1 THEN d.value END) as Col2,
       MAX(CASE WHEN d.note_id = 2 THEN d.value END) as Col3
FROM detail d JOIN
     indices i
     ON i.id = d.indices_id
GROUP BY i.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...