【问题标题】:mysql select multi rows equal from rowmysql从行中选择多行相等
【发布时间】:2019-04-18 08:18:20
【问题描述】:

我有两张桌子:

TableA          TableB
ID_A            ID_B
P1              Text
P2
P3
P4

TableB
ID_B    Text
1       Bla
2       Blabla
3       Bla bla ecc
4       Bla Bla
5       Bla bla Bla
6       Bla bla bla bla
7       Bla bli

TableA
ID_A    P1  P2  P3  P4
1       5   6   6   6

SELECT ID_A,  P1, P2, P3, P4,
       ID_B, Text
FROM TableA, TableB
WHERE (TableA.P1 = TableB.IDB) OR
      (TableA.P2 = TableB.IDB) OR
      (TableA.P3 = TableB.IDB) OR
      (TableA.P4 = TableB.IDB);

我明白了:

ID_A    P1  P2  P3  P4 ID_B Text
1       5   6   6   6   5    Bla bla Bla
1       5   6   6   6   6    Bla bla bla bla

我怎样才能得到这个?

ID_A    P1  P2  P3  P4 ID_B Text
1       5   6   6   6   5    Bla bla Bla
1       5   6   6   6   6    Bla bla bla bla
1       5   6   6   6   6    Bla bla bla bla
1       5   6   6   6   6    Bla bla bla bla

我的查询比较复杂,我已经总结了问题

【问题讨论】:

  • 从使用显式连接而不是隐式连接开始。隐式很久以前就被弃用了
  • 我不明白。如果可能的话,也许简化你的问题/数据。

标签: mysql select where operator-keyword


【解决方案1】:

要完成这项工作,您必须从tableA 的P* 列构建一个行表。然后可以将其与tableA 上的ID_A 和tableB 上的个人P* 值连接:

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       5   6   6   6   5       Bla bla Bla
1       5   6   6   6   6       Bla bla bla bla
1       5   6   6   6   6       Bla bla bla bla
1       5   6   6   6   6       Bla bla bla bla
2       3   4   5   6   3       Bla bla ecc
2       3   4   5   6   4       Bla Bla
2       3   4   5   6   5       Bla bla Bla
2       3   4   5   6   6       Bla bla bla bla

Demo on dbfiddle

【讨论】:

  • 对于 Nick,很抱歉您的代码中存在错误。请问你能帮我吗?在它们没有正确关联的行中,您可以在示例中看到第一行,文本必须是“G”而不是“F”[关于 dbfiddle 更新的演示][1] [1]:db-fiddle.com/f/nRpqNiUmpRVJJ4gMP66Ywn/2
  • @carmelocony 没有在我的电脑旁,但我已经回答了你的其他问题。
猜你喜欢
  • 1970-01-01
  • 2021-05-24
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多