Специальное объединение с ограничением и параметрами поиска - PullRequest
0 голосов
/ 02 мая 2011

Структура БД:ID |MasterID (самореф. По ID) |Код продуктаДанные БД:1 |0 |Один2 |1 |Два3 |1 |Три4 |0 |55 |0 |Шесть

Я хочу выбрать все «основные» продукты (WHERE MasterID = 0) с их детьми (WHERE MasterID = ID Master).Мне нужно ограничение на основные продукты, но их дети всегда должны быть выбраны тоже.Должен быть возможен поиск, например, для Productcode.

Я попытался что-то вроде (Подзапрос) без успеха:

SELECT * FROM (
    SELECT * FROM (
        SELECT * FROM products
        WHERE MasterID = 0
        LIMIT 100
    ) p1
    JOIN products p2 on p1.ID = p2.MasterID
) tmp
WHERE xyz = xyz

////////////////////////////РЕДАКТИРОВАТЬ:Что мне нужно иметь:

С, где Productcode = 'One' (или LIMIT 1):1 |0 |Один2 |1 |Два3 |1 |Три (потому что два других имеют значение поиска в качестве MasterID

С, где Productcode = 'Три'1 |0 |Один2 |1 |Два3 |1 |Три (потому что у Три есть Мастер, а у Мастера есть другой «вид» (Два))

//////////////////////////////

У кого-нибудь есть идеи?

С уважением, frgtv10

1 Ответ

1 голос
/ 02 мая 2011

Попробуйте:

LEFT JOIN products p2 on p1.ID = p2.MasterID

И вам не нужно 3 уровня:

SELECT p1.*
     , p2.*
FROM (
    SELECT * FROM products
    WHERE MasterID = 0
    LIMIT 100
) p1
    LEFT JOIN products p2
        ON p1.ID = p2.MasterID
        AND p2.Productcode = xyz   

Вышеприведенное вернет все основные продукты, связанные с детьми, с Productcode = xyz и всеми остальными.до 100 (не связанных) основных продуктов.


То, что вы описываете с помощью образца, гораздо сложнее:

  ( SELECT ID
         , masterID
         , Productcode
    FROM products p
    WHERE masterID = 0
      AND EXISTS
      ( SELECT *
        FROM products p2
        WHERE p.ID = p2.MasterID
          AND p2.Productcode = 'two'
      )
    LIMIT 100
  )
UNION
  ( SELECT ch.ID
         , ch.masterID
         , ch.Productcode
    FROM
      ( SELECT ID
        FROM products p
        WHERE masterID = 0
          AND EXISTS
          ( SELECT *
            FROM products p2
            WHERE p.ID = p2.MasterID
              AND p2.Productcode = 'two'
          )
        LIMIT 100
      ) AS m
    JOIN products ch
        ON m.ID = ch.MasterID
  )
ORDER BY ID 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...