2014-07-31 3 views
1

У меня есть три таблицы, которые я не могу изменить структуру:MYSQL: Выбор записей по отношению к нескольким строкам таблиц многократных

фаски

id  name 
----------------- 
1  Series 
2  Material 

значение

id  facet_id  name 
---------------------------------- 
1  2   Glass 
2  2   Metal 
3  1   Series #1 
4  1   Series #2 
5  1   Series #3 

product_facet_values ​​

product_id  value_id 
----------------------------------- 
1    1 
1    3 
2    1 
2    4 
3    2 
3    5 
4    1 

Я пытаюсь написать два запроса:

/1. Один, который вернет идентификаторы, которые представляют фасет серии из таблицы значений, где запись продукта является Glass и имеет любую серию. Так выход, как это:

id  facet_id  name 
---------------------------------- 
3  1   Series #1 
4  1   Series #2 
  • Запись 1 является не серии.
  • Запись 2 является не серии.
  • Запись 3 возвращается, потому что продукт № 1 имеет как серию, так и материал, а материал - стекло.
  • Запись 4 возвращается, потому что продукт № 2 имеет как серию, так и материал, а материал - стекло.
  • Запись 5 является не, так как продукт № 3 имеет материал металла, хотя он имеет как серию, так и материал.

/2. То же, что и номер один, но верните список идентификаторов продуктов.

product_id 
--------------- 
1 
2 
  • Продукт # 1 возвращается, потому что он имеет как ряд и материал и материал стекло.
  • Товар # 2 возвращается, потому что он имеет как серию, так и материал, а материал - стекло.
  • Товар №3 не не был возвращен, потому что он имеет материал металла, хотя он имеет как комплект, так и набор материалов.
  • Товар № 4 не не был возвращен, потому что у него нет серий, даже если материал является стеклом.
+1

звучит великолепно. что вы пробовали? –

+0

@ john-ruddell Я не очистил это, но эти и их варианты: https://gist.github.com/patrickheeney/f9e47ae81c1e01733111 – Patrick

ответ

0

ПЕРВЫЙ QUERY:

попробовать это .. Я считаю, что это будет делать трюк.

SELECT 
    v.id 
FROM value v 
JOIN product_facet_values pfv ON pfv.value_id = v.id 
WHERE pfv.product_id IN 
( SELECT 
     product_id 
    FROM product_facet_values 
    WHERE 
     product_id IN 
    ( SELECT 
      product_id 
     FROM product_facet_values 
     GROUP BY product_id 
     HAVING COUNT(*) > 1 
    ) 
     AND value_id = 1 
) 
    AND v.facet_id = 1; 

ВТОРОЙ ЗАПРОС:

внутренняя часть того же самого запроса возвращает продукты, которые имеют значение 1, а значение чего-то другого, чем один, так что бы это

SELECT 
    product_id 
FROM product_facet_values 
WHERE 
    product_id IN 
( SELECT 
     product_id 
    FROM product_facet_values 
    GROUP BY product_id 
    HAVING COUNT(*) > 1 
) 
AND value_id = 1 

ОБЪЯСНЕНИЕ:

сокровенные подзапрос:

SELECT 
    product_id 
FROM product_facet_values 
GROUP BY product_id 
HAVING COUNT(*) > 1 

дать мне продукты, которые имеют более одной записи для каждого продукта (позже фильтруются 'Glass' и 'серии')

MIDDLE подзапрос:

SELECT 
    product_id 
FROM product_facet_values 
WHERE 
    product_id IN 
( 
    INNERMOST SUBQUERY 
) 
AND value_id = 1 

дать мне продукты, которые имеют значение_id = 1 (aka 'Glass'), которые имеют более одной записи.

внешний запрос:

SELECT 
    v.id 
FROM value v 
JOIN product_facet_values pfv ON pfv.value_id = v.id 
WHERE pfv.product_id IN 
(
    MIDDLE SUBQUERY 
) 
    AND v.facet_id = 1; 

дать мне идентификатор значения для продуктов, которые связаны с 'Glass', но чей facet_id = 1 (он же серии)

+0

Я думаю, что у меня есть первый. Мне пришлось внести некоторые незначительные корректировки, потому что каждый продукт может иметь X число значений, и это просто поиск count()> 1. Идентификаторы и таблицы разные: https://gist.github.com/patrickheeney/f48aa2f2e92428d42e1e. Еще не пробовал второй, но должен быть похож. Благодаря! – Patrick

+0

На самом деле, я думаю, что мой пересмотренный вариант - это второй запрос, я ошибся. Теперь читайте новую версию. – Patrick

+0

Этот, похоже, сделал это на основе вашего первого: https://gist.github.com/patrickheeney/f48aa2f2e92428d42e1e. Спасибо за объяснение, сейчас пора интегрировать это! – Patrick

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