SQL — нужно выяснить, как показать все, чего нет у одного пользователя

У меня есть вопрос, который я ищу правильный способ сказать это … У меня есть формула:

 SELECT *
FROM useritems JOIN (iteminfo)
ON (iteminfo.id=useritems.itemid)
WHERE active='Y' AND userid!='$userid'
ORDER BY itemid DESC LIMIT 40";

Это предназначено для показа всех предметов, которые ПОЛЬЗОВАТЕЛЬ (A) не имеет.

Предположим, что ПОЛЬЗОВАТЕЛЬ А имеет элемент:
A, B, C, D, E, F,

Теоретически формула покажет только G-Z …

Моя проблема в том, что если у ПОЛЬЗОВАТЕЛЯ B есть пункт A, B, C, эти элементы отображаются в этом списке, потому что не у ПОЛЬЗОВАТЕЛЯ A есть их … ПОЛЬЗОВАТЕЛЬ B имеет их (следовательно, это не пользователь A). Как мне не показывать эти элементы в ПОЛЬЗЕ ПОЛЬЗОВАТЕЛЯ A, потому что они есть у ПОЛЬЗОВАТЕЛЯ B ???

-2

Решение

Что вам нужно сделать, это получить все возможное items которые существуют в вашем itemInfo затем найдите все те, которые A не имеет с помощью LEFT JOIN и выбрав те, которые выходят как NULL

SELECT *
FROM useritems AS 'u'
LEFT JOIN (SELECT * FROM itemInfo GROUP BY item) AS 'i'
ON u.id=i.itemid
WHERE active='Y' AND userid='$userid' AND i.item IS NULL
ORDER BY itemid DESC LIMIT 40;
0

Другие решения

Это похоже на хороший случай для левого соединения. Я бы сделал что-то вроде:

SELECT iteminfo.itemid
FROM iteminfo
LEFT JOIN useritems ON (iteminfo.id=useritems.itemid) AND (useritems.userid = '$userid')
WHERE active='Y' AND userid IS NULL
ORDER BY itemid DESC LIMIT 40";

Это предполагает, что идентификатор пользователя находится в таблице useritems. Левое соединение по идентификатору пользователя будет захватывать по одной строке для каждой записи iteminfo, а проверка того, являются ли они пустыми в WHERE, даст вам все записи iteminfo, где идентификатор пользователя не совпадает.

0

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

SELECT *
FROM iteminfo
WHERE id NOT IN (
SELECT itemid
FROM useritems
WHERE active = 'Y' AND userid = '$userid'
)
ORDER BY id DESC LIMIT 40

Или эквивалент LEFT JOIN

SELECT i.*
FROM iteminfo AS i
LEFT JOIN useritems AS u ON i.id = u.itemid AND u.active = 'Y' AND u.userid = '$userid'
WHERE u.itemid IS NULL
ORDER BY i.id DESC LIMIT 40
0
По вопросам рекламы [email protected]