Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Отсеять поле с NULL с помощью IF или CASE

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
glutaminefree
Отправлено: 30 Ноября, 2012 - 12:42:33
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Приветствую!

Есть две таблички, примерно такие:

users:
CODE (htmlphp):
скопировать код в буфер обмена
  1. +----+--------+--------------+
  2. | id | status | first_name   |
  3. +----+--------+--------------+
  4. |  1 | member | Андрей       |
  5. |  2 | member | Имя          |
  6. |  3 | member | Имя          |
  7. |  4 | member | Имя          |
  8. +----+--------+--------------+


user_meta
CODE (htmlphp):
скопировать код в буфер обмена
  1. +----+----------------+--------------+
  2. | id | meta_name      | meta_value   |
  3. +----+----------------+--------------+
  4. |  3 | translate_type | localization |
  5. |  3 | experience     | 2            |
  6. |  4 | translate_type | written      |
  7. |  4 | translate_type | voice        |
  8. |  4 | experience     | 5            |
  9. +----+----------------+--------------+


Поле id в user_meta является внешним ключом к id в users.

Выполняю запрос:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT
  2.         id,
  3.         STATUS,
  4.         first_name,
  5.         CASE meta_name
  6.                 WHEN 'experience' THEN meta_value
  7.         END AS experience
  8. FROM
  9.         users
  10. INNER JOIN
  11.         user_meta USING(id)
  12. WHERE
  13.         role = 'translator'
  14.         AND (STATUS = 'member' OR STATUS = 'del' )
  15.         AND (meta_name = 'translate_type' AND meta_value = 'localization')
  16.         OR meta_name = 'experience'


Получается:
CODE (htmlphp):
скопировать код в буфер обмена
  1. +----+--------+------------+------------+
  2. | id | status | first_name | experience |
  3. +----+--------+------------+------------+
  4. |  3 | member | Имя        | NULL       |
  5. |  3 | member | Имя        | 2          |
  6. |  4 | member | Имя        | 5          |
  7. +----+--------+------------+------------+


В результат попадает лишняя строка с NULL из-за условия:
CODE (SQL):
скопировать код в буфер обмена
  1. AND (meta_name = 'translate_type' AND meta_value = 'localization')

Но она мне не нужна.
Как бы сделать так, чтобы она не попадала в результат? Думал, что CASE мне в этом как раз поможет, но он NULL подставляет, если условия не сходится.
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Ноября, 2012 - 12:58:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. ... AND experience IS NOT NULL
 
 Top
glutaminefree
Отправлено: 30 Ноября, 2012 - 13:01:36
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Добавил в WHERE - получил ошибку:

ERROR 1054 (42S22): Unknown column 'experience' in 'where clause'
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Ноября, 2012 - 13:05:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Вот интересно почему...
Тогда:
CODE (SQL):
скопировать код в буфер обмена
  1. ... HAVING experience IS NOT NULL
 
 Top
glutaminefree
Отправлено: 30 Ноября, 2012 - 13:07:25
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Да, я вот тоже уже подумал в сторону HAVING. Работает, спасибо за помощь Улыбка
 
 Top
Мелкий Супермодератор
Отправлено: 30 Ноября, 2012 - 13:15:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




glutaminefree пишет:
В результат попадает лишняя строка с NULL из-за условия:

Так уберите условие, удовлетворяющее ненужные строки.

И расставьте скобки в where, укажите явно, что вы хотите. Я не сразу могу понять, что meta_name = 'experience' взаимосвязано со всеми предыдущими условиями and.
И null как раз же от этого experience и остаётся.


-----
PostgreSQL DBA
 
 Top
glutaminefree
Отправлено: 30 Ноября, 2012 - 13:18:19
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Мелкий пишет:
Так уберите условие, удовлетворяющее ненужные строки.

Хех, если бы оно было не нужно, то убрал бы, конечно.
 
 Top
Мелкий Супермодератор
Отправлено: 30 Ноября, 2012 - 13:20:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Если вы его отфильтровываете через having - оно не нужно.


-----
PostgreSQL DBA
 
 Top
glutaminefree
Отправлено: 30 Ноября, 2012 - 13:24:22
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Просто в таблице user_meta хранятся разные данные. Мне нужно получить значение experience, и проверить, чтобы translate_type был определённого значения, но при этом не нужно его получать.
А структура таблиц приведена выше, если что.
 
 Top
Мелкий Супермодератор
Отправлено: 30 Ноября, 2012 - 15:19:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




glutaminefree, ну и? Почему бы его и не получать, раз не нужен?


-----
PostgreSQL DBA
 
 Top
glutaminefree
Отправлено: 30 Ноября, 2012 - 15:29:56
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Мелкий пишет:
glutaminefree, ну и? Почему бы его и не получать, раз не нужен?


Так значения то в одних и тех же полях.

CODE (htmlphp):
скопировать код в буфер обмена
  1. +----+----------------+--------------+
  2. | id | meta_name      | meta_value   |
  3. +----+----------------+--------------+
  4. |  3 | translate_type | localization |
  5. |  3 | experience     | 2            |
  6. |  4 | translate_type | written      |
  7. |  4 | translate_type | voice        |
  8. |  4 | experience     | 5            |
  9. +----+----------------+--------------+
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB