2016-02-10 6 views
0

У меня есть три таблицы: Ses user, Ses Moves и Moves.Выбор нескольких строк из одного столбца - соединения

  • Ses user имеет столбцы id, user и ses-id.
  • Ses Moves имеет столбцы ses-id и move-id.
  • Moves имеет столбцы id и name.

Я присоединился к Ses user с Ses Moves по id и ses-id. Я также присоединился к Ses Moves с Moves по move-id и id.

Единственная проблема заключается в наличии нескольких строк в Moves таблицы, которые имеют тот же идентификатор, так это выглядит примерно так:

+------+-=---+ 
|Ses ID| Name| 
+------+-----+ 
| 10 | Bite| 
+------+-----+ 
| 10 | Eat | 
+------+-----+ 
| 10 |Crush| 
+------+-----+ 
| 10 |Punch| 
+------+-----+ 
| 10 |Stare| 
+------+-----+ 
| 10 | Rest| 
+------+-----+ 

Я хочу SQL заявление вернуть что-то вроде этого:

+------+-----------+-----------+-----------+-----------+-----------+-----------+ 
|Ses ID|Name Move 1|Name Move 2|Name Move 3|Name Move 4|Name Move 5|Name Move 6| 
+------+-----------+-----------+-----------+-----------+-----------+-----------+ 
| 10 | Bite | Eat  | Crush | Punch | Stare | Rest | 
+------+-----------+-----------+-----------+-----------+-----------+-----------+ 

Что может сделать, чтобы вернуть это?

Если это помогает знать, я использую PHP для выполнения запроса. .

+0

Вы пробовали что-нибудь еще для достижения этого? – 1000111

+0

Скорее всего, с настройкой, которую у вас есть сейчас, я сомневаюсь, что один запрос даст точный формат, который вам нужен, однако, поскольку вы используете PHP, вы можете обрабатывать данные после того, как они были запрошены. Вы просто пропустите ответы и настройте данные с помощью PHP. – LuvnJesus

ответ

0

Это не слишком трудно подвиг с динамическим SQL (если вы не знаете, максимальное количество имен данный Ses ID может иметь Вот пример:

SET NOCOUNT ON; 

-- CREATE TABLE #table ([Ses ID] INT, Name NVARCHAR(255)); 
-- INSERT #table VALUES (10, 'Bite'),(10,'Eat'),(10,'Crush'),(10,'Punch'),(9,'Hugs'),(9,'Kisses'); 

DECLARE @SQL NVARCHAR(4000) = ' 
WITH CTE AS (
    SELECT [Ses ID], Name, ROW_NUMBER() OVER (PARTITION BY [Ses ID] ORDER BY Name) RN 
    FROM #table) 
SELECT [Ses ID]' 
, @MaxRN INT = (SELECT MAX(RN) 
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY [Ses ID] ORDER BY Name) RN 
    FROM #table) T) 
, @i INT = 1; 

WHILE @i <= @MaxRN BEGIN 
    SET @SQL += ', (SELECT Name FROM CTE WHERE RN = ' + CAST(@i AS NVARCHAR(255)) + ' AND [Ses ID] = C.[Ses ID]) [Name Move ' + CAST(@i AS NVARCHAR(255)) + ']'; 
    SET @i += 1; 
END 

SET @SQL += ' 
FROM CTE C 
GROUP BY [Ses ID] 
ORDER BY [Ses ID]'; 

EXEC(@SQL); 

-- DROP TABLE #table;