Результаты умножения бд при многократном


Со вчерашнего дня я застрял на проблеме, которая сводит меня с ума, я чувствую, что чего-то не хватает. Вот контекст: Я - продукты (узел). В каждом продукте у меня есть теги (термины таксономии) в поле ссылки на термин с неограниченным количеством возможных значений.

Я просто пытаюсь запросить свои товары, используя фильтр тегов. Но как только я выбираю несколько тегов, если их несколько, как эти теги, результаты умножаются на количество соответствующих тегов.

В запрос довольно большой, поэтому я упрощаю его здесь, чтобы добиться того же результата.

Структура узла:

Title ------- | Quantity | Tags Tid
Product 1 --- | -- 1 --- | 12, 15
Product 2 --- | -- 4 --- | 13

Таблицы выглядят так:

Узел:

Title ------- | Nid
Product 1 --- | 320
Product 2 --- | 321

Количество:

quantity_value | entity_id
1 ------------ | 320
4 ------------ | 321

Теги:

tid | entity_id
12  | 320
13  | 321
15  | 320

Я использую db_query для своего запроса:

Итак, предположим, что я хочу отфильтровать продукт, у которого теги tid равны 12 и 15 (продукт 1)

$query = db_query("
  SELECT n.title, SUM(q.quantity_value)
  FROM {node} n
  JOIN {quantity} q
  ON q.entity_id = n.nid
  LEFT JOIN {tags} t
  ON t.entity_id = n.nid
  WHERE t.tid IN (12, 15)
  GROUP BY n.title
  HAVING COUNT(DISTINCT t.tid) = count(12,15)
");
$results = $query->fetchAll();

Этот запрос возвращает мне 1 строку с продуктом 1, но количеством = 2 вместо 1. Я пробовали подзапрос "В" и множество других вещей, но ничего не сработало. Единственное решение, которое у меня сейчас есть, - это разделить СУММУ (q.quantity_value) на КОЛИЧЕСТВО (n.название), это сработало бы, но я думаю, что есть лучший способ сделать это:)

Спасибо за вашу помощь!

Ред

 1
Author: Doud, 2016-06-26

1 answers

Гул... Классическое "Я уверен, что пробовал это раньше, и это не сработало"... Я потратил целый день на поиски решения и нашел его через 5 минут после публикации здесь:)

$query = db_query("
  SELECT n.title, SUM(q.quantity_value)
  FROM {node} n
  JOIN {quantity} q
  ON q.entity_id = n.nid
  WHERE EXISTS (SELECT *
    FROM {tags} t
    WHERE t.entity_id = n.nid
    AND t.tid IN (12, 15))
    HAVING COUNT(DISTINCT t.tid) = count(12,15)
  GROUP BY n.title
");
$results = $query->fetchAll();

Подзапрос был правильным решением (если у кого-то есть что-то лучшее, чтобы предложить, я бы с удовольствием это услышал).

Спасибо,

Ред

 0
Author: Doud, 2016-06-26 18:04:44