Проверка выполнения на наличие значений - PullRequest
0 голосов
/ 01 августа 2011

У меня небольшая проблема с производительностью MySQL-запроса, и я не знаю, как его правильно построить, поэтому он работает с минимальными усилиями.

Проблема:

Представьте себе таблицу с двумя столбцами: user (int), item (int)

Пользователи имеют разные элементы, связанные с. Возможно, у пользователя-1 есть элемент-1, элемент-2, элемент-3, а у пользователя-2 - элемент-1, элемент-3, элемент-4.

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

То, с чего я начал, было

SELECT item
FROM table
WHERE item IN (SELECT item FROM table WHERE user = X) AND user != X
GROUP BY item

... но это было неэффективно, потому что в этом случае запрос просматривает всю таблицу и проверяет каждый элемент, даже если он уже найден. Я не могу ограничить запрос, потому что я не знаю, сколько элементов на самом деле есть у user-X. И отправка поискового запроса с LIMTI 1 для каждого элемента в отдельности также не очень хорошая идея.

В качестве абстракции вы также можете сказать, что я хочу знать, связан ли набор item-X, ..., item-Y (не порядковая или непрерывная нумерация) хотя бы с одним пользователем.

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

Итак, как это можно сделать правильно? Спасибо за любые предложения!

Ответы [ 3 ]

1 голос
/ 01 августа 2011

То, что вы ищете, это предложение EXISTS .

Будет оцениваться как true , если в предоставленном подзапросе есть какие-либо совпадающие строки.

SELECT item
FROM table AS t1
WHERE user = X
  AND EXISTS ( SELECT * FROM table AS t2 WHERE user <> X AND t1.item = t2.item )
GROUP BY item
0 голосов
/ 01 августа 2011
SELECT DISTINCT t1.item
    FROM table t1
        INNER JOIN table t2
            ON t1.item = t2.item
                AND t1.user <> t2.user
    WHERE t1.user = X
0 голосов
/ 01 августа 2011

Это просто ХАЙВИНГ, нет?

дайте мне вещи, которые есть у пользователя x и как минимум у одного пользователя

SELECT item
FROM table
GROUP BY item -- per item
HAVING 
  COUNT (DISTINCT UserID) > 1 -- more than one user for an item
  AND 
  COUNT(CASE WHEN userID = X THEN 1 ELSE NULL END) > 0 -- including user x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...