2015-11-15 44 views
0

У меня есть таблица с некоторыми пользовательскими данными, а вторая с данными о свойствах пользователя. Свойства всегда будут 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; 
+1

Макс. Вам не хватает max – Strawberry

+0

Спасибо, в этом была проблема! –

ответ

0

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 
Join User_Properties oup 
On ou.username = oup.username; 
Смежные вопросы