У меня есть таблица под названием review
:
review_id cat_id public_or_private
1 1 0
11 2 2
12 3 1
13 4 2
14 5 2
И таблица под названием category
:
cat_id user_id
1 10298
2 10299
3 10300
4 10299
5 10298
Мое заявление:
$sql2 = "SELECT *
FROM review
INNER JOIN category ON review.cat_id = category.cat_id
WHERE review.public_or_private = 2";
Это даст мне результат:
review_id cat_id public_or_private cat_id user_id
11 2 2 2 10299
13 4 2 4 10299
14 5 2 5 10298
contacts
таблица:
user_id contact_id
10299 10298
10299 10300
10300 10298
10300 10301
Как я могу отточить это дальше? : Мне нужны результаты только в том случае, если user_id
не находится в столбце contact_id
таблицы contacts
.
Итак, с точки зрения пользователя 10300
результат должен быть:
review_id cat_id public_or_private cat_id user_id
11 2 2 2 10299
13 4 2 4 10299
Я считаю, что мне следует использовать NOT EXISTS
или NOT IN
, но не знаю, как это сказать.
У каждого пользователя приложения есть user_id
, который подключается к базе данных через php и делает разные вещи. Таблица contacts
в столбце contact_id
содержит контакты 10300
или того, кто user_id
вошел в систему. Надеюсь, это немного прояснит ситуацию...
Итак, вам нужен запрос, который для любого пользователя, у которого еще нет контактов, возвращает отзывы с public_or_private = 2
, а также возвращает пользователей, написавших эти отзывы. Это только для одного бесконтактного пользователя? Или несколько?
Пожалуйста, внимательно изучите вопрос, прежде чем задавать вопрос. Часто ответы уже здесь.
@KIKOSoftware Да, верно. Это будет для любого пользователя user_id, который входит в систему. Я смотрю на ответ alx ниже, думаю, он, возможно, решил мою проблему. Тх.
Я думаю, это то, что вы хотите:
SELECT *
FROM review
INNER JOIN category ON review.cat_id = category.cat_id
LEFT JOIN contacts ON contacts.user_id = category.user_id
WHERE review.public_or_private = 2
AND contacts.contact_id IS NULL
И вот пример, подтверждающий это утверждение: http://www.sqlfiddle.com/#!9/7bfb62/3
Это также работает:
SELECT *
FROM review
INNER JOIN category ON review.cat_id = category.cat_id
WHERE review.public_or_private = 2
AND NOT EXISTS(
SELECT *
FROM contacts
WHERE contacts.user_id = category.user_id
);
А вот и обновленная рабочий пример: http://www.sqlfiddle.com/#!9/7bfb62/5
К сожалению, это дублирующий вопрос.
@mickmackusa Почти все вопросы в некотором роде дублируются, вы говорите, что вы выбрал, чтобы закрыть этот вопрос.
Правильно, почти все вопросы дублируются.
Да, и два других вопроса по какой-то причине не помечены как повторяющиеся.
@mickmackusa Пометка вопросов как дубликатов делается для улучшения качества содержимого Stack Overflow, но какие вопросы на самом деле закрыты, как здесь, довольно произвольно. Просто не приятно, когда ты потратил время на подготовку ответа, а кто-то другой просто убирает возможность его дать. Это заставляет вас отвечать быстро, но не слишком тщательно, а это противоположно первоначальной цели пометки дубликатов. (кстати, не по вашей вине)
Я бы сказал, что есть хорошие и плохие дубликаты. Хорошие — когда один и тот же вопрос задается по-разному, что добавляет разные варианты использования, контекст и ключевые слова для поиска. Плохие — это просто плохие вопросы: слишком мало или совсем не гуглил, прежде чем задать. Это плохо, кстати.
@alx Отлично, спасибо. Ваш запрос на самом деле дает мне тот, который я НЕ искал :), но я изменил его - я использую AND NOT EXISTS
- на AND NOT EXISTS(SELECT * FROM contacts WHERE contacts.contact_id = category.user_id);
, и теперь он дает правильный результат.
@mickmackusa На самом деле я потратил несколько часов, пытаясь решить проблему самостоятельно, прежде чем опубликовать. И я не пишу легкомысленно, потому что вопрос иногда занимает больше времени, чем исследование, которое вы проводили заранее.
Это тоже верное замечание: иногда вы не знаете достаточно, чтобы правильно задать вопрос. (Я слишком часто оказываюсь в таком положении, ТБХ.) Вероятно, это потому, что, как говорится, правильный вопрос уже содержит 50% ответа. А ТАК - это один огромный котел людей и знаний, без разнообразия по уровням знаний.
Я нахожу использование
user_id
иcontact_id
очень запутанным. Что они представляют? Что все это означает и что на самом деле делает запрос, который вы хотите?