MySQL中的动态透视表

MySQL中的动态透视表,mysql,Mysql,我正在尝试创建一个基于200多个不同值的透视表。一位朋友准备了一个我在T-SQL中需要的工作示例,但是在MySQL中没有行数函数,我无法将其转换为我需要的 UniqueTally值是Word在这个值之前出现的不同值的计数。下面的示例显示,当a再次出现在第3行中时,这不会像第1行一样增加唯一性 我的数据如下所示: SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := mem

我正在尝试创建一个基于200多个不同值的透视表。一位朋友准备了一个我在T-SQL中需要的工作示例,但是在MySQL中没有行数函数,我无法将其转换为我需要的

UniqueTally值是Word在这个值之前出现的不同值的计数。下面的示例显示,当a再次出现在第3行中时,这不会像第1行一样增加唯一性

我的数据如下所示:

SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemo ORDER BY memberId A;
表字

| WordID     | MemberID   | Word     | UniqueTally   
| 1          | 1          | a        | 1
| 2          | 1          | b        | 2
| 3          | 1          | a        | 2
| 4          | 2          | c        | 1
| 5          | 2          | d        | 2
| 6          | 2          | e        | 3
我有200多个成员,我正在尝试创建一个表,显示所有成员的唯一计数是如何增加的。即,按成员对齐唯一值。Word index是此成员的行条目号

| WordIndex  | UniqueTallyMember1 | UniqueTallyMember2 | etc   
| 1          | 1                  | 1        
| 2          | 2                  | 2        
| 3          | 2                  | 3        
一位朋友善意地在T-SQL中生成了我需要的代码:

/* Return the data */
SELECT
   [WordSpoken]
   ,[182] AS [Mem182_UniqueTally]
   ,[200] AS [Mem200_UniqueTally]
FROM (
   SELECT [WordSpoken], [MemberID], [UniqueTally]
   FROM (
          SELECT
                 ROW_NUMBER() OVER(PARTITION BY [MemberID] ORDER BY 
[WordID]) AS [WordSpoken]
                 ,[MemberID]
                 ,[UniqueTally]
          FROM [dbo].[ut_test]
          ) AS [test]
   ) AS [tbl]
PIVOT (MAX(UniqueTally) FOR MemberID IN ([182],[200])) AS [pvt]
GO
这仅使用2个MemberID值,但其工作原理与对齐唯一值一样。 我需要MySQL中类似的东西,它也动态地接受MemberID。这可能吗


我已经尝试过谷歌搜索其他类似的帖子,但我无法将它们直接转化为我的问题。

模拟行数的直接方法是使用ORDER by有条件地递增会话变量。请参见此示例:

#DROP TEMPORARY TABLE IF EXISTS sessionVarDemo;
CREATE TABLE sessionVarDemo(memberId INT UNSIGNED);

INSERT INTO sessionVarDemo VALUES (1), (2), (3), (2), (3), (1), (2), (2), (1), (1);

SET @VMemberID := 0, @VCounter := 0;

#Ensure data is correctly ordered
#DROP TEMPORARY TABLE IF EXISTS sessionVarDemoOrdered;
CREATE TEMPORARY TABLE sessionVarDemoOrdered SELECT memberId FROM sessionVarDemo ORDER BY memberId;

SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemoOrdered A;
请注意,根据您的本地设置,在没有临时表的情况下,这是可能的,如下所示:

SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemo ORDER BY memberId A;
问候,

编辑1

如果您运行此代码,您是否会获得memberid为1-3且行号正确递增的以下输出

#DROP TEMPORARY TABLE IF EXISTS sessionVarDemo;
CREATE TABLE sessionVarDemo(memberId INT UNSIGNED);

INSERT INTO sessionVarDemo VALUES (1), (2), (3), (2), (3), (1), (2), (2), (1), (1);

SET @VMemberID := 0, @VCounter := 0;

SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId FROM sessionVarDemo ORDER BY memberId A;

+-----------+----------+
| rowNumber | memberId |
+-----------+----------+
|         0 |        1 |
|         1 |        1 |
|         2 |        1 |
|         3 |        1 |
|         4 |        1 |
|         5 |        1 |
|         6 |        1 |
|         7 |        1 |
|         0 |        2 |
|         1 |        2 |
|         2 |        2 |
|         3 |        2 |
|         4 |        2 |
|         5 |        2 |
|         6 |        2 |
|         7 |        2 |
|         0 |        3 |
|         1 |        3 |
|         2 |        3 |
|         3 |        3 |
+-----------+----------+
20 rows in set (0.00 sec)
编辑2

下面是我如何使用会话变量在friends伪代码中实现ROW_编号:

SET @VMemberID := 0, @VCounter := 0;

/* Return the data */
SELECT
   [WordSpoken]
   ,[182] AS [Mem182_UniqueTally]
   ,[200] AS [Mem200_UniqueTally]
FROM (
   SELECT [WordSpoken], [MemberID], [UniqueTally]
   FROM (
          SELECT @VCounter := IF(@VMemberID != memberId, 0, @VCounter + 1) rowNumber, @VMemberID := memberId memberId
          FROM [dbo].[ut_test]
          ORDER BY [WordSpoken]
                 ,[MemberID]
                 ,[UniqueTally]
          ) AS [test]
   ) AS [tbl]
PIVOT (MAX(UniqueTally) FOR MemberID IN ([182],[200])) AS [pvt]
GO

James

谢谢James,虽然我不知道如何将其放入查询其余部分的嵌套选择中。在回答中添加了一点,你能给我回电话吗?谢谢,尽管每个成员都需要一个唯一的列。这段没有Pivot的代码生成COL,但不是正确的值。我将继续设置@VMemberID:=0、@VCounter:=0;从SELECT MemberID中选择182作为M182_唯一,从SELECT@VCounter中选择200作为M200_唯一,从SELECT@VCounter:=IF@VMemberID != MemberID,0,@VCounter+1 uniquetaly,@VMemberID:=WordShort中的MemberID MemberID作为测试作为tbl PIVOT MaxUniquetaly作为PVT在182200中作为MemberID你能用代码从我的编辑中明确回答这个问题吗?“如果您运行此代码,您是否会得到以下输出,memberid为1-3,行数正确递增?’,如果我知道这一点,我可以尝试修改您的查询。此代码根据您的输出集@VMMemberID:=0,@VCounter:=0,为我提供相同列中的所有成员;选择@VCounter:=IF@VMemberID != MemberID,0,@VCounter+1唯一,@VMMemberId:=MemberID根据MemberID从WordShort ORDER中提取MemberID;