【问题标题】:Selecting multiple rows from the same column - joins从同一列中选择多行 - 连接
【发布时间】:2016-05-20 07:35:46
【问题描述】:

我有三个表:Ses userSes MovesMoves

  • Ses user 具有 iduserses-id 列。
  • Ses Moves 具有 ses-idmove-id 列。
  • Moves 具有 idname 列。

我通过idses-id 加入了Ses userSes Moves。我还通过move-idid 加入了Ses MovesMoves

唯一的问题是Moves 表中有多个具有相同 id 的行,所以它看起来像这样:

+------+-=---+
|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 运行查询。

【问题讨论】:

  • 您是否尝试过任何方法来实现这一目标?
  • 很可能,根据您现在的设置,我怀疑单个查询会产生您想要的确切格式;但是,由于您使用的是 PHP,因此您可以在查询数据后对其进行处理。您将简单地遍历响应并使用 PHP 将数据制成表格。

标签: mysql sql-server database join


【解决方案1】:

对于动态 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;

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2020-07-12
    • 2015-09-25
    • 2015-05-03
    • 2015-03-03
    • 2021-06-15
    相关资源
    最近更新 更多