2010-02-08 2 views
4

Что я пытаюсь сделать, чтобы все пользователи, у которых нет значения, установленного для fid = 13 или вообще не имеют значения в profile_values. Я предполагаю, что это простое решение, но я просто этого не вижу. Любая помощь или точка в правильном направлении приветствуются.MySQL Query - помощь с выбором

(В таблицах пользователей и profile_values ​​оба из Drupal.)

Упрощенные значения:

uid name fid  value 
1 user1 1  foo 
1 user1 2  foo 
2 user2 12  
2 user2 13  1265662514 
3 user3 NULL NULL 
4 user4 NULL NULL 

То, что я пытался:

SELECT u.uid, u.name, pv.fid, pv.value 
FROM users u 
LEFT JOIN profile_values pv ON pv.uid = u.uid 
WHERE u.status != 0 
AND (pv.fid != 13 OR pv.fid IS NULL) 
GROUP BY u.uid 

uid  name  fid  value 
1  user1  1  foo 
2  user2  12  foo 
3  user3  NULL NULL 
4  user4  NULL NULL 

Моя проблема в том, user2, которая не должна если оно имеет значение в fid = 13


Спасибо за все невероятные быстрые и квалифицированные ответы, приветствия!

ответ

1

Вы хотите добавить предложение AND: И u.uid NOT IN (выберите uid from profile_values ​​где fid = 13) как bad_uids

+0

это не сработает. взгляните на мой и обсуждение Энтони ниже – zerkms

+0

Собственно, это похоже на работу в сочетании с OR (pv.fid = 13 AND pv.value = '') ... если я не замечаю что-то – Borgenk

+0

@Borgenk: почему бы и нет? ;-) Вы пробовали посмотреть это предложение EXPLAIN? ;-) – zerkms

0

Может попробовать

AND (pv.fid != 13 OR pv.value IS NOT NULL) 

?

Ваши условия немного непонятно:

получить все пользователи, которые не имеют значение, установленное для FID = 13 или никакой ценности в profile_values ​​

Это означает «получить все пользователи с fid, равным чему-то, кроме 13 И с некоторым значением в profile_values ​​"?

+0

и это будет выбрать user2 - 12, потому что 12 = 13 и 12 IS NOT NULL – zerkms

+0

ли они не хотят user2? – Anthony

+0

О, извините, я искал неправильную часть вопроса. Почему user2 появляется дважды? Не имея уникального идентификатора, это проблема сама по себе, не так ли? – Anthony

1

WHERE NOT EXISTS (SELECT 1 FROM profile_values ​​ръ WHERE pv.uid = u.uid И pv.fid = 13)

это на самом деле медленным решением, но я не могу понять, любой другой путь

0

Вы хотите только профили, где значение НЕ пустое, а fid - не 13, не так ли? Таким образом, это означает, что если оба истины ИЛИ, если они верны, пропустите эти записи. Поэтому не группируйте их вместе и используйте OR. Использование и:

WHERE 
u.status != 0 
AND 
pv.fid != 13 
AND 
pv.fid IS NOT NULL 

ИЛИ

WHERE 
u.status != 0 
AND 
pv.fid IS NOT (13 OR NULL) 
+0

http: // stackoverflow.com/вопросы/2225622/mysql-query-help-with-selection/2225646 # 2225646 - посмотрите мой комментарий там – zerkms

Смежные вопросы