2017-01-19 5 views
3

Привет, у меня проблема с выбором строк из таблиц базы данных.Выделить все строки из объединенной таблицы в виде столбцов

Таблица A

Id, name 

Таблица B

Id, playingdate, points 

Таблица а и б связаны с такой, как a.id = b.id

Данные за столом

1, john 
2, tim 

Данные для таблицы б

1, 20170101, 3455 
1, 20170108, 4532 
2, 20170101, 5666 
2, 20170108, 4768 

Так я хочу, чтобы вернуть

John, 3455, 4532 
Tim, 5666, 4768 

Как я Buid SQL, выберите?

+0

Если количество игровых дат будет переменным/неизвестным, для этого вам понадобится динамический SQL. Вы еще что-то пробовали? –

+0

Вы не можете вернуть переменное число столбцов с помощью «ванильного» SQL, вам нужно будет вернуть две строки возврата для каждого из этих чисел и присоединиться к списку в вашем приложении. – jackarms

+0

выберите имя, точки из таблицы a, таблицу b где a.id = b.id; –

ответ

1

Не знаю, почему это нужно, так как точки может быть очень длинным:

SELECT A.name, group_concat(B.points) 
FROM A 
JOIN B ON A.id = B.id 
GROUP BY A.name 

AS вы также попросили его в колонках, то он даже редко используется. Однако, если столбец фиксируется как: имя, 20170101, 20170108, тогда SQL-будет:

SELECT 
    A.name, 
    ifnull(B1.points,0) AS '20170101', 
    ifnull(B2.points,0) AS '20170108' 
FROM A 
LEFT JOIN B AS B1 ON A.id = B1.id AND B1.playingdate = 20170101 
LEFT JOIN B AS B2 ON A.id = B2.id AND B2.playingdate = 20170108 
+1

Что делать, если OP нуждается в обеих точках в виде двух разных столбцов? – Viki888

+0

ifnull или isnull? – Khoshtarkib

+0

ifnull (col, null_replacement) vs isnull (col) - они разные – SIDU

0

Первый GROUP_CONCAT и CONCAT с именем таблицы А и В:

SELECT concat(A.name, ',' , group_concat(B.points)) as name_points 
     FROM A 
     left outer join B ON A.id = B.id 
     GROUP BY A.id 

SELECT A.name, group_concat(B.points) as points 
     FROM A 
     left outer join B ON A.id = B.id 
     GROUP BY A.id 
0

Ниже приведено рабочее решение по вашему запросу .... дайте мне знать, если у вас есть какие-либо вопросы, чтобы получить его ...

set @row1 := 0; 
set @row2 := 0; 
select a.id,a.name,c.p1,c.p2 
from a 
inner join 
(
select b1.id,b1.p1,b2.p2 
from 
    ( 
    select @row1 := @row1 +1 as r1,b.id ,b.points as p1 
    from b 
    group by id 
    )b1 
inner join 
    (
    select @row2 := @row2 +1 as r2,b.points as p2 
    from b 
    )b2 
on b1.r1+1 = b2.r2 
)c on a.id = c.id