2016-09-17 9 views
1

Мой запрос получает результаты этих продуктов на основе того, существуют ли они в отдельном индексе таблицы. Я пытаюсь получить счет всех экземпляров, где они существуют, поэтому я могу ЗАКАЗАТЬ результаты по релевантности. Все, что я пытаюсь, похоже, возвращает переменную @priority как 0. Любые идеи?Подсчитайте количество раз, когда индекс существует с использованием запроса, содержащего несколько операторов EXIST()

Возможно, лучше использовать заявления о соединении?

Благодарим за помощь. Вот мой MySQL запросов:

SELECT `products` . * , @priority 
    FROM `products` 
    LEFT JOIN productstypes_index ON productstypes_index.product_id = products.id 
WHERE (

EXISTS (

SELECT * 
    FROM `productstypes_index` 
    WHERE `productstypes_index`.`product_id` = `products`.`id` 
    AND `productstypes_index`.`_type_id` = '1' 
) 
AND (
(
(

EXISTS (

SELECT @priority := COUNT(*) 
    FROM `producthashtags_index` 
    WHERE `producthashtags_index`.`product_id` = `products`.`id` 
    AND `producthashtags_index`.`producthashtag_id` = '43' 
) 
) 
AND (

EXISTS (

SELECT @priority := COUNT(*) 
    FROM `producthashtags_index` 
    WHERE `producthashtags_index`.`product_id` = `products`.`id` 
    AND `producthashtags_index`.`producthashtag_id` = '11' 
) 
) 
) 
) 
) 
ORDER BY `updated_at` DESC; 
+0

MySQL игнорирует список SELECT в подзапросе EXISTS, поэтому не имеет значения, что вы набираете там. –

ответ

0

Вы можете обойтись без этих exists и без переменных. Кроме того, left join не имеет смысла, если у вас есть условие exists на объединенной таблице. Тогда вы также можете сделать более эффективный inner join и поместить дополнительное условие типа в условие соединения.

Приоритет может быть рассчитан по счету хэш-тегов, но только с id in ('43', '11').

SELECT  products.* 
      count(distinct producthashtags_index.producthashtag_id) priority 
FROM  products 
INNER JOIN productstypes_index 
     ON productstypes_index.product_id = products.id 
     AND productstypes_index._type_id = '1' 
INNER JOIN producthashtags_index 
     ON producthashtags_index.product_id = products.id 
     AND producthashtags_index.producthashtag_id in ('43', '11') 
GROUP BY products.id 
ORDER BY updated_at DESC; 
+0

Я думаю, что вы на что-то, но моя индексная таблица, producthashtags_index, не имеет идентификатора. –

+0

Эй, trincot, мне не нужно, чтобы я присоединился к producthashtag_index где-то здесь? Я получаю ошибку: Неизвестный столбец 'producthashtags_index.producthashtag_id' в 'списке полей' –

+0

Да, это так. Позвольте мне уточнить, что ... – trincot

0

MySQL игнорирует список SELECT, в EXISTS подзапрос, так что нет никакой разницы, что вы типа там. Это задокументировано here.

Подход с использованием объединений будет выглядеть следующим образом:

SELECT p.id, 
     COUNT(case when phi.product_id is not null then 1 end) AS instances 
FROM products p 
INNER JOIN productstypes_index pti ON pti.product_id = p.id AND pti.`_type_id` = 1 
LEFT JOIN producthashtags_index phi ON phi.product_id = p.id AND phi.producthashtag_id IN (11,43) 
GROUP BY p.id 
ORDER BY instances DESC; 

Я удалил дополнительные кавычку, где я считаю, что они не обязательны, а также если ваши id столбцы в таблицах целые числа, вам не нужны кавычки.

+0

@RickJames спасибо за ваше редактирование. Скопировать пали псевдонимы ... :) –

+0

Как и в другом решении, мне кажется, мне нужен уникальный идентификатор для моих индексных таблиц. –

+0

@KevinJ Я отредактировал ответ. Попробуй это. –