2016-02-25 3 views
0

Я привык делать запросы с sparql, но я должен сделать это с помощью mysql, что я действительно не знаю синтаксиса. У меня есть эти три таблицы:mysql inner join 3 таблицы и объединение

Продукты:

id o 
    1 p1 
    2 p2 

Спецификация:

id o 
    3 sp1 
    4 sp2 

Источник:

id o 
    1 s1 
    3 s1 
    2 s2 
    4 s2 

Как мы видим, продукты и технические характеристики могут быть подключены с источником разных идентификаторов, поэтому я думаю, что мне нужно сделать 2 выбора с 2 внутренним соединением s между исходным> продукт и источник> спецификации и внутреннее соединение между 2 выбирает:

 SELECT * FROM 
     (
      SELECT pt.o as po, st.id as psID, st.o as pso 
      FROM source_test st 
      inner join products_test pt on st.id = pt.id 
     ) x INNER JOIN 
     (
      SELECT st2.o as spo, st1.id as spsID,st1.o as spso  
      FROM source_test st1 
      inner join specification_test st2 on st1.id =st2.id 
     ) y 

Это дает:

po psID pso spo spsID spso 
    p1 1 s1 sp1 3 s1 
    p2 2 s2 sp1 3 s1 
    p1 1 s1 sp2 4 s2 
    p2 2 s2 sp2 4 s2 

Теперь мне нужно фильтровать продукт (ПО) и спецификации (SPO) которые имеют один и тот же источник (PSO), (SPSO)

Я я делать вещи правильно, что может быть продолжением или хороший запрос, чтобы получить:

po spo spso 
    p1 sp1 s1 
    p2 sp1 s2 

Заранее спасибо.

+0

Вы можете удалить тег SQL Server. Это другой продукт. Многие решения SQL Server не работают в MySQL, и наоборот. –

ответ

0

Единственное, что я должен был сделать это, чтобы фильтровать у ON x.pso = y.spso

SELECT * FROM 
    (
     SELECT product.o as po, source.s as psID, source.o as pso FROM source 
     inner join product 
      on source.s = product.s 
    ) x INNER JOIN 
    (
     SELECT specification.o as spo, source.s as spsID, source.o as spso FROM source 
     inner join specification 
      on source.s = specification.s 
    ) y ON x.pso = y.spso 

результат:

po psID pso spo spsID spso 
    p1 1 s1 sp1 3 s1 
    p2 2 s2 sp2 4 s2 
0
select p.o, s.o, so.o 
from products p 
    left join specification s 
    left join source so on p.id=s.id and p.id = so.id; 
+0

Предложение 'ON' для первого' LEFT JOIN'? Это допустимый синтаксис MySQL? (Синтаксическая ошибка в соответствии с большинством других продуктов и ANSI SQL тоже.) – jarlh

+0

Также где условие pso <> spso? – sagi

+0

@jarlh Я могу подтвердить, что это действительный синтаксис mysql –

0

Добавить ON x.pso = y.spso по Вашему запросу:

SELECT x.po, y.spo, y.spso 
FROM 
(
    SELECT products_test.o as po, source_test.id as psID, source_test.o as pso FROM source_test 
    inner join products_test 
     on source_test.id = products_test.id 
) x INNER JOIN 
(
    SELECT specification_test.o as spo, source_test.id as spsID,source_test.o as spso  
    FROM source_test 
    inner join specification_test on source_test.id =specification_test.id 
) y  
    ON x.pso = y.spso 
+0

Собственно, это тот ответ, который я дал. – user2598997

+0

Похоже, мы ответили одновременно. Приветствия! – pbo