MySQL, как выбрать поле или установить ноль, если поле равно нулю? - PullRequest
0 голосов
/ 30 июня 2019

Есть ли способ сделать что-то вроде:

SELECT (user OR NULL if field IS NULL)
FROM user
WHERE (
    field = 'id'
    OR field IS NULL
)

Моя база данных настроена на

+-----------
| bookmarks 
+-----------
| id int not null primary key
| title varchar(255) not null
| url varchar(255) not null
| icon varchar(255)
| description varchar(255)
| addedby int foreignkey references users(id) on delete set null
+-----------

+-----------
| users
+-----------
| id int not null primary key
| email varchar(255) not null
| user varchar(255) not null
| pass varchar(255) not null
+-----------

+-----------
| user_bookmarks
+-----------
| user_id foreignkey references user(id) on delete cascade
| bookmark_id foreignkey references bookmarks(id)
| primarykey(user_id, bookmark_id)
+-----------

Я пытаюсь изменить запрос:

SELECT DISTINCT B.*, MU.user, MUB.subscribers
FROM user_bookmarks UB, bookmarks B, users U, (
    SELECT bookmark_id, COUNT(bookmark_id) AS subscribers
    FROM user_bookmarks
    GROUP BY bookmark_ID
) AS MUB, (
    SELECT user, id
    FROM users
) AS MU
WHERE MUB.bookmark_id = UB.bookmark_id
AND B.id = MUB.bookmark_id
AND UB.user_id = $id
AND U.id = UB.user_id
AND MU.id = B.addedby

Мой запрос, вероятно, ужасен, с SQL я не часто работаю.

То, что я хочу сделать, это компенсировать, когда пользователь больше не находится в системе (пользователь, который добавил закладку (addedby)), когда закладка просматривается с помощью идентификатора другого пользователя, который все еще подписан (U.id = $id), я хочу, чтобы поле пользователя (MU.user) оставалось, но было заполнено null.

Пример вывода (в настоящее время) с использованием $id = 93:

id, title, url, icon, description, addedby, user, subscribers
'93', 'title93', 'https://www.somewhere93.com', '', 'Something 93', '93', 'user93', '10'
'94', 'title94', 'https://www.somewhere94.com', '', 'Something 94', '94', 'user94', '10'
'95', 'title95', 'https://www.somewhere95.com', '', 'Something 95', '95', 'user95', '10'
'96', 'title96', 'https://www.somewhere96.com', '', 'Something 96', '96', 'user96', '10'
'97', 'title97', 'https://www.somewhere97.com', '', 'Something 97', '97', 'user97', '10'
'98', 'title98', 'https://www.somewhere98.com', '', 'Something 98', '98', 'user98', '10'
'99', 'title99', 'https://www.somewhere99.com', '', 'Something 99', '99', 'user99', '10'
'100', 'title100', 'https://www.somewhere100.com', '', 'Something 100', '100', 'user100', '10'
'102', 'title102', 'https://www.somewhere102.com', '', 'Something 102', '2', 'user2', '8'

id 101 отсутствует, это потому, что (SELECT * FROM bookmarks WHERE id = 101) Поле addedby равно нулю, я хочу, чтобы мой запрос также возвращал закладку 101, аналогичную другой только с user и addedby будучи нулевым, поскольку пользователь больше не существует:

id, title, url, icon, description, addedby
'101', 'title101', 'https://www.somewhere101.com', '', 'Something 101', NULL

Ответы [ 3 ]

0 голосов
/ 30 июня 2019

Если вы работаете с Microsoft SQL SERVER, используйте следующий синтаксис: SELECT (ISNULL (пользователь, «нет пользователя») как ColUser) ОТ пользователя WHERE (поле = 'id')

0 голосов
/ 30 июня 2019

Я думаю, что вы хотите одну строку, которая имеет значение пользователя, если доступно, или значение null. Если это так, один из методов - union all:

select u.user
from user u
where u.field = @id
union all
select null
from dual
where not exists (select 1 from user u where u.field = @id);

Однако более простой и, вероятно, более производительный метод - это агрегирование:

select max(u.user) as user
from user u
where u.field = @id;

Запросы агрегации без group by всегда возвращают ровно одну строку. Если ни одна строка не соответствует условиям where, тогда значение равно null - это то, что вам нужно.

Или аналогичный подход с подзапросом:

select (select u.user
        from user u
        where u.field = @id
        limit 1
      );
0 голосов
/ 30 июня 2019

Как то так?

SELECT ID, IFNULL(User, 'N/A') User, COALESCE(User, Field, 'N/A') Field
FROM User WHERE (Field = ID) OR (Field IS NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...