СЛЕДУЕТ ПРИСОЕДИНЯТЬСЯ К ВСЕМ результатам - PullRequest
1 голос
/ 21 июня 2011

Привет, ребята. У меня проблема с запросом и оставлено соединение.

У меня есть две таблицы продуктов и характеристик. Я знаю некоторые необходимые характеристики с идентификатором 1,3,6

 SELECT * FROM products
    LEFT JOIN characteristics ...
    WHERE characteristics_id IN (1,2,6)

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

На самом деле мне нужно

 SELECT * FROM products
    INNER JOIN characteristics as c1 ... AND c1.id=1
    INNER JOIN characteristics as c2 ... AND c2.id=2
    INNER JOIN characteristics as c2 ... AND c2.id=3
...

Но это не нравитсямне должно быть проще и эффективнее

Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 июня 2011

Прежде всего, вам вообще не нужно LEFT JOIN.

Во-вторых, ваша первая попытка кажется совершенно правильной, и я думаю, что она наиболее эффективна (когда есть таблицы для таблиц, которые нужно объединить).Но я добавляю другой способ (который кажется более простым, поскольку он имеет только 1 объединение).


Простой (чтобы добавить более 3 характеристик):

SELECT p.*
FROM products AS p
  INNER JOIN characteristics AS c ON ...
WHERE c.id IN (1, 3, 6)
GROUP BY p.id
HAVING
  COUNT(*) = 3             --- or COUNT(DISTINCT c.id)
                           --- depending on your data

Подробнее эффективно (другими словами, другими словами: тестируйте, тестируйте и тестируйте снова в своих таблицах с различными размерами и числом идентификаторов):

SELECT p.* 
FROM products AS p
  INNER JOIN characteristics AS c1 ON ... 
  INNER JOIN characteristics AS c2 ON ... 
  INNER JOIN characteristics AS c3 ON ... 
WHERE c1.id = 1 
  AND c2.id = 3 
  AND c3.id = 6 
0 голосов
/ 21 июня 2011

возможно, вы могли бы использовать подвыбор и что-то вроде этого:

SELECT * FROM
  products
WHERE
  (
  SELECT COUNT(*) FROM
    characteristics
  WHERE product = products.id AND characteristics_id IN (1,2,3)
  ) >= 3;

обратите внимание, что это не проверено, потому что вы не опубликовали свои точные определения таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...