Что мне нужно в моем запросе, возможно НЕ СУЩЕСТВУЕТ или НЕ В?

У меня есть таблица под названием 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 и contact_id очень запутанным. Что они представляют? Что все это означает и что на самом деле делает запрос, который вы хотите?

KIKO Software 20.06.2019 13:28

У каждого пользователя приложения есть user_id, который подключается к базе данных через php и делает разные вещи. Таблица contacts в столбце contact_id содержит контакты 10300 или того, кто user_id вошел в систему. Надеюсь, это немного прояснит ситуацию...

CHarris 20.06.2019 13:36

Итак, вам нужен запрос, который для любого пользователя, у которого еще нет контактов, возвращает отзывы с public_or_private = 2, а также возвращает пользователей, написавших эти отзывы. Это только для одного бесконтактного пользователя? Или несколько?

KIKO Software 20.06.2019 13:50

Пожалуйста, внимательно изучите вопрос, прежде чем задавать вопрос. Часто ответы уже здесь.

mickmackusa 20.06.2019 13:53

@KIKOSoftware Да, верно. Это будет для любого пользователя user_id, который входит в систему. Я смотрю на ответ alx ниже, думаю, он, возможно, решил мою проблему. Тх.

CHarris 20.06.2019 13:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, это то, что вы хотите:

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 20.06.2019 13:49

@mickmackusa Почти все вопросы в некотором роде дублируются, вы говорите, что вы выбрал, чтобы закрыть этот вопрос.

KIKO Software 20.06.2019 13:52

Правильно, почти все вопросы дублируются.

mickmackusa 20.06.2019 13:53

Да, и два других вопроса по какой-то причине не помечены как повторяющиеся.

alx 20.06.2019 13:56

@mickmackusa Пометка вопросов как дубликатов делается для улучшения качества содержимого Stack Overflow, но какие вопросы на самом деле закрыты, как здесь, довольно произвольно. Просто не приятно, когда ты потратил время на подготовку ответа, а кто-то другой просто убирает возможность его дать. Это заставляет вас отвечать быстро, но не слишком тщательно, а это противоположно первоначальной цели пометки дубликатов. (кстати, не по вашей вине)

KIKO Software 20.06.2019 14:01

Я бы сказал, что есть хорошие и плохие дубликаты. Хорошие — когда один и тот же вопрос задается по-разному, что добавляет разные варианты использования, контекст и ключевые слова для поиска. Плохие — это просто плохие вопросы: слишком мало или совсем не гуглил, прежде чем задать. Это плохо, кстати.

alx 20.06.2019 14:12

@alx Отлично, спасибо. Ваш запрос на самом деле дает мне тот, который я НЕ искал :), но я изменил его - я использую AND NOT EXISTS - на AND NOT EXISTS(SELECT * FROM contacts WHERE contacts.contact_id = category.user_id);, и теперь он дает правильный результат.

CHarris 20.06.2019 14:12

@mickmackusa На самом деле я потратил несколько часов, пытаясь решить проблему самостоятельно, прежде чем опубликовать. И я не пишу легкомысленно, потому что вопрос иногда занимает больше времени, чем исследование, которое вы проводили заранее.

CHarris 20.06.2019 14:15

Это тоже верное замечание: иногда вы не знаете достаточно, чтобы правильно задать вопрос. (Я слишком часто оказываюсь в таком положении, ТБХ.) Вероятно, это потому, что, как говорится, правильный вопрос уже содержит 50% ответа. А ТАК - это один огромный котел людей и знаний, без разнообразия по уровням знаний.

alx 20.06.2019 14:19

Другие вопросы по теме