У меня есть вопрос, который я ищу правильный способ сказать это … У меня есть формула:
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 ???
Что вам нужно сделать, это получить все возможное 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;
Это похоже на хороший случай для левого соединения. Я бы сделал что-то вроде:
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, где идентификатор пользователя не совпадает.
Ваш запрос показывает все элементы, хранящиеся у пользователей, кроме 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