Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

JOIN некоторых строк к таблице как новых столбцов

#php #mysql #sql


Всем привет. Предположим есть таблица:


| id | item |
-------------
|  1 |  egg |


Довольно не большая, но для примера сойдет.

Есть вторая таблица:


| id | item_id | shape | corners |
----------------------------------
|  1 |       1 | round |       0 |
|  2 |       1 |  cube |       4 |


Буду краток - вопрос:
Как получить следующую таблицу? 


| id | item | round | cube |
----------------------------
|  1 |  egg |     0 |    4 |


З.Ы. Соединение идет по id <-> item_id
    


Ответы

Ответ 1



Как говорит @BOPOH можно использовать JOIN, но единствено верным будет использование GROUP_CONCAT: SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(t2.shape = ''', shape, ''', t2.corners, NULL)) AS ', shape)) INTO @pivot_sql FROM table2; SET @pivot_sql = CONCAT('SELECT t1.id, t1.item, ', @pivot_sql, ' FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.id = t2.item_id GROUP BY t1.id, t1.item'); PREPARE stmt FROM @pivot_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; UPDATE Как отметили в комментариях, лучше собирать необходимый запрос на клиенте.

Ответ 2



можно конечно так SELECT a1.id, a1.item, (SELECT corners from table2 where item_id = a1.id limit 0, 1) as round, (SELECT corners from table2 where item_id = a1.id limit 1, 1) as cube from( SELECT id, item from table1 ) as a1 Так будет отображено, но вообщето зачем оно вам нужно? не лучше ли выбирать данные так как они есть и просто при отображении манипулировать ими? (т.е выбрали данные с помощью JOIN а когда обрабатываете заносите в массив и все...у вас данные готовые к работе) На клиенте тоже можно манипулирвоать данными, как писали выше, но тут какбы вопрос (зачем выбирать данные из базы которые не нужны?), если у вас данные на клиенте часто нужно будет отображаться то одни то другие динамически, то чтобы не делать выборки из базы туда сюда...может и имеет смысл выбирать кучу и уже на клиенте ее отобажать , если задача такого не предусматривает то я бы не стал на клиенте это делать.

Комментариев нет:

Отправить комментарий