Результаты умножения бд при многократном
Со вчерашнего дня я застрял на проблеме, которая сводит меня с ума, я чувствую, что чего-то не хватает. Вот контекст: Я - продукты (узел). В каждом продукте у меня есть теги (термины таксономии) в поле ссылки на термин с неограниченным количеством возможных значений.
Я просто пытаюсь запросить свои товары, используя фильтр тегов. Но как только я выбираю несколько тегов, если их несколько, как эти теги, результаты умножаются на количество соответствующих тегов.
В запрос довольно большой, поэтому я упрощаю его здесь, чтобы добиться того же результата.
Структура узла:
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 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();
Подзапрос был правильным решением (если у кого-то есть что-то лучшее, чтобы предложить, я бы с удовольствием это услышал).
Спасибо,
Ред