SQL-запрос не равен оператору, который не работает, с JOIN - PullRequest
0 голосов
/ 16 октября 2018

Интересно, может ли кто-нибудь помочь мне с запросом SQL.

Я пытаюсь отобразить все результаты, кроме случаев, когда в таблице 2 столбец userid равен 1, а скрытый столбец равен 1.

Я в основном пытаюсь скрыть результаты от отдельных пользователей на основе их id и значения в скрытом столбце либо 1, либо пусто.

Мне до сих пор удавалось сделать запрос, который выполняетнапротив и не могу понять, как это изменить.Я попытался добавить !=, <>, NOT и некоторые другие вещи, но у меня ничего не работает!

Вот запрос, с которым я работаю.

$stmt = $conn->prepare("SELECT tl.id, tl.name, tl.locale, uh.hidden 
  FROM theList AS tl 
  LEFT JOIN user_hidden_list AS uh ON uh.est_id = tl.id 
  WHERE uh.userid = '1' AND uh.hidden = '1'");

Как отобразить все результаты, ожидаемые результаты с uh.userid = 1 и uh.hidden = 1

ОБНОВЛЕНИЕ: Таблицы

Таблица: user_hidden_list

 userid | Hidden | est_id
---------------------------
   1    | 1      |   1
   2    | 1      |   1
   1    | 1      |   2

Таблица:theList

id |    name  | locale
------------------------
 1 |    Jacks   |   LDN
 2 |    MacD's  |   LDN
 3 |    BK      |   LDN
 4 |    Byron   |   LDN

Так что, если я вошел в систему с и userid из:

1, я должен увидеть: БК и Байрон.

2 Я должен видеть: MacD, BK и Байрон.

3 (или что-нибудь еще), которые я должен видеть: домкраты, MacD, BK и Байрон.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Если я правильно понял, таблица user_hidden_list поддерживает связь между одним пользователем и пользователями, которых он не видит.Так, например, пользователь с идентификатором, равным 1 (соответствует столбцу ИД пользователя ), не может видеть пользователей 1 и 2 (соответствует столбцу est_id).

Итак, для конкретного пользователя с ID = X мы можем получить список ID пользователя, которого он не может видеть следующим:

SELECT
    est_id
FROM
    user_hidden_list
WHERE
    userid = X AND hidden = 1;

Используя предыдущий запрос, мы можем получить видимых пользователей для пользователя X , как в следующем запросе:

SELECT
    tl.id, tl.name, tl.locale
FROM
    theList AS tl
WHERE
    tl.id NOT IN (SELECT est_id
                  FROM user_hidden_list
                  WHERE userid = X AND hidden = 1);

Я уверен, что будетбыть лучшим (изящным) способом сделать это, но я просто ухожу с работы, и мой ум сейчас не работает хорошо.

0 голосов
/ 17 октября 2018

Попробуйте, даже с парантезами:

SELECT tl.id, tl.name, tl.locale, uh.hidden 
FROM theList tl JOIN
      user_hidden_list uh
      ON uh.est_id = tl.id 
WHERE (uh.userid <> 1 AND uh.hidden <> 1);
0 голосов
/ 16 октября 2018

Я пытаюсь отобразить все результаты, кроме случаев, когда в Таблице 2 столбец идентификатора пользователя равен 1, а скрытый столбец равен 1.

Это не означает, что внешний join.Вы, кажется, хотите:

SELECT tl.id, tl.name, tl.locale, uh.hidden 
FROM theList tl JOIN
      user_hidden_list uh
      ON uh.est_id = tl.id 
WHERE NOT (uh.userid = 1 AND uh.hidden = 1);

Я предполагаю, что userid и hidden являются числами некоторого вида, поэтому я удалил одинарные кавычки.Если они действительно являются строками, используйте одинарные кавычки.

Это также предполагает, что эти значения не могут быть NULL.Если это возможно, то логику можно скорректировать (используя нулевой безопасный компаратор <=>).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...