mysql select 多行等于第 2 行
mysql select multi rows equal from row 2
我有两个表:
TableA TableB
ID_A ID_B
P1 Text
P2
P3
P4
-
TableB
ID_B Text
1 A
2 B
3 C
4 D
5 E
6 F
7 G
-
TableA
ID_A P1 P2 P3 P4
1 7 5 6 6
感谢帮助我的Nick
USER Nick
SELECT a.*, b.*
FROM (SELECT ID_A, P1 AS P FROM TableA
UNION ALL
SELECT ID_A, P2 FROM TableA
UNION ALL
SELECT ID_A, P3 FROM TableA
UNION ALL
SELECT ID_A, P4 FROM TableA) p
JOIN TableA a ON a.ID_A = p.ID_A
JOIN TableB b ON b.ID_B = p.P
ORDER BY a.ID_A, b.ID_B
我得到:
ID_A P1 P2 P3 P4 ID_B Text
1 7 5 6 6 5 E
1 7 5 6 6 6 F
1 7 5 6 6 6 F
1 7 5 6 6 7 G
我怎样才能得到这个?
ID_A P1 P2 P3 P4 ID_B Text
1 7 5 6 6 7 G
1 7 5 6 6 5 E
1 7 5 6 6 6 F
1 7 5 6 6 6 F
1° 行 P1 = ID_B
2°行 P2 = ID_B
3°行 P3 = ID_B
4°行 P4 = ID_B
您可以使用 CASE
、WHEN
进行自定义排序。这将以所需的排序显示结果
SELECT a.*, b.*
FROM (SELECT ID_A, P1 AS P FROM TableA
UNION ALL
SELECT ID_A, P2 FROM TableA
UNION ALL
SELECT ID_A, P3 FROM TableA
UNION ALL
SELECT ID_A, P4 FROM TableA) p
JOIN TableA a ON a.ID_A = p.ID_A
JOIN TableB b ON b.ID_B = p.P
ORDER BY CASE b.ID_B
WHEN 7 THEN 4
WHEN 5 THEN 3
ELSE 2
END DESC
SELECT * FROM TableA as a1
left join TableB as b1 on ID_B = p1
union ALL
SELECT * FROM TableA
left join TableB on ID_B = p2
union ALL
SELECT * FROM TableA
left join TableB on ID_B = P3
union ALL
SELECT * FROM TableA
left join TableB on ID_B = p4
发生这种情况是因为 P
值的派生 table 中没有顺序。为了能够对其进行排序,我们可以添加另一个表示 P
数字的字段(如 P1
、P2
等)并按其排序而不是 ID_B
:
SELECT a.*, b.*
FROM (SELECT 1 AS PNUM, ID_A, P1 AS P FROM TableA
UNION ALL
SELECT 2, ID_A, P2 FROM TableA
UNION ALL
SELECT 3, ID_A, P3 FROM TableA
UNION ALL
SELECT 4, ID_A, P4 FROM TableA) p
JOIN TableA a ON a.ID_A = p.ID_A
JOIN TableB b ON b.ID_B = p.P
ORDER BY a.ID_A, p.PNUM
输出:
ID_A P1 P2 P3 P4 ID_B Text
1 7 5 6 6 7 G
1 7 5 6 6 5 E
1 7 5 6 6 6 F
1 7 5 6 6 6 F
我有两个表:
TableA TableB
ID_A ID_B
P1 Text
P2
P3
P4
-
TableB
ID_B Text
1 A
2 B
3 C
4 D
5 E
6 F
7 G
-
TableA
ID_A P1 P2 P3 P4
1 7 5 6 6
感谢帮助我的Nick USER Nick
SELECT a.*, b.*
FROM (SELECT ID_A, P1 AS P FROM TableA
UNION ALL
SELECT ID_A, P2 FROM TableA
UNION ALL
SELECT ID_A, P3 FROM TableA
UNION ALL
SELECT ID_A, P4 FROM TableA) p
JOIN TableA a ON a.ID_A = p.ID_A
JOIN TableB b ON b.ID_B = p.P
ORDER BY a.ID_A, b.ID_B
我得到:
ID_A P1 P2 P3 P4 ID_B Text
1 7 5 6 6 5 E
1 7 5 6 6 6 F
1 7 5 6 6 6 F
1 7 5 6 6 7 G
我怎样才能得到这个?
ID_A P1 P2 P3 P4 ID_B Text
1 7 5 6 6 7 G
1 7 5 6 6 5 E
1 7 5 6 6 6 F
1 7 5 6 6 6 F
1° 行 P1 = ID_B
2°行 P2 = ID_B
3°行 P3 = ID_B
4°行 P4 = ID_B
您可以使用 CASE
、WHEN
进行自定义排序。这将以所需的排序显示结果
SELECT a.*, b.*
FROM (SELECT ID_A, P1 AS P FROM TableA
UNION ALL
SELECT ID_A, P2 FROM TableA
UNION ALL
SELECT ID_A, P3 FROM TableA
UNION ALL
SELECT ID_A, P4 FROM TableA) p
JOIN TableA a ON a.ID_A = p.ID_A
JOIN TableB b ON b.ID_B = p.P
ORDER BY CASE b.ID_B
WHEN 7 THEN 4
WHEN 5 THEN 3
ELSE 2
END DESC
SELECT * FROM TableA as a1
left join TableB as b1 on ID_B = p1
union ALL
SELECT * FROM TableA
left join TableB on ID_B = p2
union ALL
SELECT * FROM TableA
left join TableB on ID_B = P3
union ALL
SELECT * FROM TableA
left join TableB on ID_B = p4
发生这种情况是因为 P
值的派生 table 中没有顺序。为了能够对其进行排序,我们可以添加另一个表示 P
数字的字段(如 P1
、P2
等)并按其排序而不是 ID_B
:
SELECT a.*, b.*
FROM (SELECT 1 AS PNUM, ID_A, P1 AS P FROM TableA
UNION ALL
SELECT 2, ID_A, P2 FROM TableA
UNION ALL
SELECT 3, ID_A, P3 FROM TableA
UNION ALL
SELECT 4, ID_A, P4 FROM TableA) p
JOIN TableA a ON a.ID_A = p.ID_A
JOIN TableB b ON b.ID_B = p.P
ORDER BY a.ID_A, p.PNUM
输出:
ID_A P1 P2 P3 P4 ID_B Text
1 7 5 6 6 7 G
1 7 5 6 6 5 E
1 7 5 6 6 6 F
1 7 5 6 6 6 F