2016-06-21 2 views
3

у меня есть две таблицы Плейс и пост, который мне нужно, чтобы генерировать выходной сигналMySQL - Соединение таблиц на основе нескольких столбцов во втором

place 
-------------- 
std_id sch_id 
1  1 
2  2 
3  1 
4  3 
5  4 
6  2 
7  5 
8  3 
9  5 
10  4 

и

Post 
------------ 
sch1_id sch2_id sch3_id sup_id 
1  2  3  1 
3  2  4  2 

мне нужно сгенерировать следующий вывод

sup_id sch_id std_id 
1  1  1 
1  1  3 
1  2  2 
1  2  6 
1  3  4 
1  3  8 
2  3  4 
2  3  8 
2  2  2 
2  2  6 
2  4  5 
2  4  10 

Я попробовал этот

SELECT pl.std_id,po.sup_id FROM `place` pl,`post` po WHERE pl.sch_id = 
po.sch1_id group by po.sup_id 

и получил этот

| std_id | sup_id | 
|--------|--------| 
|  1 |  1 | 
|  4 |  2 | 

EDIT

SQLFiddle

+0

Первый нормализуют свой дизайн. Каждый раз, когда вы оказываетесь с перечисляемыми столбцами (за пределами «2», скажем), сигнальные колокола должны звонить – Strawberry

+0

, как это можно нормализовать, любые предложения? – Smith

+1

'Post (sup_id *, sch_number *, sch_id)' * = компонент PRIMARY KEY – Strawberry

ответ

3

Просто нас е IN():

SELECT pl.std_id,pl.sch_id,po.sup_id 
FROM `place` pl 
INNER JOIN `post` po 
ON(pl.sch_id IN(po.sch1_id,po.sch2_id,po.sch3_id)) 

Нет необходимости нормализации данных, хотя это очень рекомендуется !! Вы должны пересмотреть свою структуру таблиц.

2

Вы можете попробовать 'ип-поворотными' стол post с помощью UNION ALL:

SELECT pl.std_id, po.sch_id, po.sup_id 
FROM `place` pl 
JOIN (
    SELECT sch1_id AS sch_id, sup_id 
    FROM `post` 

    UNION ALL 

    SELECT sch2_id AS sch_id, sup_id 
    FROM `post` 

    UNION ALL 

    SELECT sch3_id AS sch_id, sup_id 
    FROM `post` 

    UNION ALL 

    SELECT sch4_id AS sch_id, sup_id 
    FROM `post` 
) AS po ON pl.sch_id = po.sch_id 
+0

[Fiddler] (http://rextester.com/OQF28072) для него. – Arulkumar

3

Похоже, что вы хотите, чтобы сформировать присоединиться соответствие любой из Sch * значений, Если это так, то один из способов будет использовать несколько условий в соединении:

select sup_id, sch_id, std_id 
from post p 
join place pl on pl.sch_id = p.sch1_id 
       or pl.sch_id = p.sch2_id 
       or pl.sch_id = p.sch3_id 
+0

Это неэффективно. – sagi

+0

@sagi Это может быть неэффективно, но по крайней мере он дает желаемый результат ... В SQL Fiddle наши два запроса имеют один и тот же план выполнения (как и следовало ожидать). – jpw

+0

@sagi, почему вы сказали, что он неэффективен? – Smith

Смежные вопросы