У меня есть таблица с некоторыми пользовательскими данными, а вторая с данными о свойствах пользователя. Свойства всегда будут 2, и я знаю их имя. Мне нужен запрос для извлечения всего в одной структуре. Однако я не могу изменить схему базы данных.MySQL Поворот строк и столбцов
Это упрощенная версия моей базы данных:
USER
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| username | varchar(64) | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
+-------------------+--------------+------+-----+---------+-------+
USER_PROPERTIES
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| username | varchar(64) | NO | PRI | NULL | |
| propName | varchar(100) | NO | PRI | NULL | |
| propValue | text | NO | | NULL | |
+-----------+--------------+------+-----+---------+-------+
Так что, например, эти данные:
USER
username name
1 User1
2 User2
USER_PROPERTIES
username propName propValue
1 status "At work"
1 picture "pict1.jpg"
2 status "Busy"
2 picture "pict2.jpg"
я должен был бы следующий результат:
username name STATUS PICTURE
1 User1 "At work" "pict1.jpg"
2 User2 "Busy" "pict2.jpg"
Я сделал некоторые исследования в Интернете и по-видимому, это достигается с PIVOT, но MySQL не содержит эту функцию. Следуя ответы здесь: MySQL pivot table, мне удалось получить это:
select ou.username,
case when (oup.propName='status') then oup.propValue end as 'STATUS',
case when (oup.propName='picture') then oup.propValue end as 'PICTURE'
from User ou, User_Properties oup
where ou.username = oup.username;
username name STATUS PICTURE
1 User1 "At work" null
1 User1 null "pict1.jpg"
2 User2 "Busy" null
2 User2 null "pict2.jpg"
Результаты представлены в двух разных линий. Если я группирую результаты по имени пользователя, я всегда получаю данные PICTURE:
select ou.username,
case when (oup.propName='status') then oup.propValue end as 'STATUS',
case when (oup.propName='picture') then oup.propValue end as 'PICTURE'
from User ou, User_Properties oup
where ou.username = oup.username
group by oup.username;
username name STATUS PICTURE
1 User1 "At work" null
2 User2 "Busy" null
Что мне не хватает? Благодарю.
EDIT: https://stackoverflow.com/users/1529673/strawberry дал решение:
select ou.username,
MAX(case when (oup.propName='status') then oup.propValue end) as 'STATUS',
MAX(case when (oup.propName='picture') then oup.propValue end) as 'PICTURE'
from User ou, User_Properties oup
where ou.username = oup.username;
Макс. Вам не хватает max – Strawberry
Спасибо, в этом была проблема! –