MySQL выбирает не прочитанные сообщения - PullRequest
0 голосов
/ 01 сентября 2018

Так что я пытаюсь выбрать непрочитанные сообщения с запросом, но результаты пустые. Мне нужно получить информацию из отдельной таблицы для чтения, чтобы она знала, прочитана она или нет. Я пытаюсь сделать что-то вроде оператора IF, так что если readed не существует, оно будет непрочитанным, но я не могу это исправить

это мой запрос:

 SELECT * FROM notify 
 INNER JOIN readed ON readed.acc_ID = '26' AND readed.user_ID = '6' 
        AND readed.msg_ID = notify.ID AND readed.readed != '1' OR readed.ID IS NULL 
 WHERE notify.groep = '1'


DB - readed

ID         - int
user_ID    - int
acc_ID     - int
msg_ID     - int
readed     - enum ('0','1')

DB - notify

ID         - int
notfi      - text
thumb_src  - text
title      - text
url        - text
groep      - int

Надеюсь, кто-то знает, в чем проблема!

1 Ответ

0 голосов
/ 01 сентября 2018

Мне кажется, что запрос правильный, кроме части с OR, поэтому я полагаю, что проблема связана с данными. Сначала я попытаюсь показать, как можно улучшить запрос, а затем попытаюсь показать, как отладить ваши данные.

Во-первых, давайте оставим условие OR, поскольку оно не будет работать так, как ожидалось в предложении JOIN ON.

Во-вторых, при сравнении целочисленных полей со значениями не следует заключать в кавычки значения. Это будет беспокоить только каждого, кто пытается понять запрос, потому что кавычки обозначают string значения, и это будет беспокоить (то есть замедлять) синтаксический анализатор MySQL, потому что он должен преобразовывать строковые значения в числа.

В-третьих, смешивание нормальных WHERE условий и JOIN ON условий вызывает беспокойство и плохой стиль (ИМХО). Я всегда рекомендую ставить только те условия, которые фактически связывают таблицы , в предложение JOIN ON и другие условия в других местах.

Следование этому совету приведет к чему-то такому:

SELECT * FROM
  notify INNER JOIN readed ON
    readed.msg_ID = notify.ID
WHERE
  readed.acc_ID = 26 AND
  readed.user_ID = 6 AND
  readed.readed != '1' AND
  notify.groep = 1

Это должно быть сделано так же, как ваш исходный запрос, за исключением OR части.

Теперь, поскольку мы подозреваем, что есть проблема с данными, мы можем начать отладку данных. Во-первых, пропустите пункт WHERE:

SELECT * FROM
  notify INNER JOIN readed ON
    readed.msg_ID = notify.ID

Если это возвращает данные, то вы по крайней мере знаете, что в таблице readed есть строки, совпадающие со строками в таблице notify. Если он не возвращает никаких данных, то нет строк, которые бы совпали, и нашли корень вашей проблемы.

При условии, что вышеприведенное возвращает данные, заново построчно добавляйте предложение WHERE и проверяйте после каждого шага. Например, начните с

SELECT * FROM
  notify INNER JOIN readed ON
    readed.msg_ID = notify.ID
WHERE
  readed.acc_ID = 26 AND

и продолжить с

SELECT * FROM
  notify INNER JOIN readed ON
    readed.msg_ID = notify.ID
WHERE
  readed.acc_ID = 26 AND
  readed.user_ID = 6 AND

и т. Д., Каждый раз проверяя запрос.

Таким образом, вы надеетесь выяснить, в чем проблема. Я убежден, что проблема связана с данными, а не с запросом.

...