mysql, как найти уникальную строку, когда вы храните данные горизонтально в наборе данных - PullRequest
0 голосов
/ 08 сентября 2018

Я храню данные в профиле пользователя, скажем,

userid | field_title | field_value
1      |   fname     |  JD1
1      |   lname     |  JD1
1      |   website   |  www.JD 
2      |   fname     |  JD2
2      |   lname     |  JD2
2      |   website   |  www.JD2
3      |   fname     |  JD3
3      |   lname     |  JD3
4      |   fname     |  JD4
4      |   lname     |  JD4
4      |   website   |  www.JD

Как видно из приведенного выше примера, я храню данные по горизонтали.

Итак, идентификатор пользователя 1,2 и 4 имеет веб-сайт. Но идентификатор пользователя 3 не имеет веб-сайта.

Теперь, когда я пишу запрос. Скажем, имя таблицы foo

select * from foo where title!="website"

Это вернет мне все 4.

Как мне написать запрос, чтобы получить только 3?

Ответы [ 3 ]

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

В основном вам нужно искать пользователей, у которых нет их записей имеет field_title из 'website'. Этого можно достичь с помощью предложения NOT EXISTS:

SELECT *
FROM foo f1
WHERE NOT EXISTS (SELECT *
                  FROM foo f2
                  WHERE field_title = 'website' AND f1.userid = f2.userid)

Выход:

userid  field_title     field_value
3       fname           JD3
3       lname           JD3
0 голосов
/ 08 сентября 2018

Предполагая, что у вас есть таблица с именем user, в которой хранится по одному пользователю на строку, вы можете сделать это:

SELECT u.id from user u 
LEFT JOIN user_attributes ua 
 ON (u.id = ua.id AND ua.field_title='website')
WHERE ua.field_title IS NULL

Поскольку LEFT JOIN гарантирует, что у вас есть хотя бы одна строка для каждого пользователя, независимо от того, совпадает ли предложение ON с предложением ON, совпадающим с чем-то, что вам не нужно, а затем с предложением WHERE, где одно из полей, которое обычно не NULL, фильтруется по ним, будучи NULL, вернет одну строку с пользователем 3.

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

Если у вас есть первичный ключ в вашей таблице, попробуйте, предположив здесь id

SELECT f1.userid 
FROM   foo f1 
       LEFT JOIN foo f2 
              ON ( f1.userid = f2.userid 
                   AND f1.id < f2.id ) 
WHERE  f2.id IS NULL 
       AND f1.field_title != "website"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...