mysql выбирает несколько строк, равных из строки

#mysql #select #where #operator-keyword

#mysql #выберите #где #оператор-ключевое слово

Вопрос:

У меня есть две таблицы:

 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
 

мой запрос более сложный, я обобщил проблему

Комментарии:

1. начните с использования явных объединений вместо неявных. Неявные давно устарели

2. Я этого не понимаю. Возможно, упростите вашу проблему / данные, если это возможно.

Ответ №1:

Чтобы сделать эту работу, вы должны построить таблицу строк из P* столбцов tableA . Затем это может быть присоединено к tableA on ID_A и к tableB on отдельным 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
 

Демонстрация на dbfiddle

Комментарии:

1. Что касается Ника, я сожалею, что в вашем коде есть ошибка. Пожалуйста, не могли бы вы мне помочь? В строках они неправильно соотнесены, вы можете видеть в примере первую строку, текст должен быть «G» без «F» [Демонстрация в обновлении dbfiddle] [1] [1]: db-fiddle.com/f/nRpqNiUmpRVJJ4gMP66Ywn/2

2. @carmelocony не был на моем компьютере, но я ответил на ваш другой вопрос.