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
Форумы портала PHP.SU :: Версия для печати :: mysql + case
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » mysql + case

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

1. ridvik - 14 Января, 2014 - 19:11:26 - перейти к сообщению
Добрый вечер. Объясните пожалуйста, как пользоваться оператором CASE.
Я использую такой запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, name, game,
  2. CASE type
  3. WHEN 1 THEN 1
  4. WHEN 2 THEN 2
  5. WHEN 3 THEN 3
  6. ELSE 4 END
  7. FROM dynamit_tournaments WHERE id='1'

Вывожу через
echo "<pre>";
print_r($row);
Показывает:
PHP:
скопировать код в буфер обмена
  1. (
  2.     [0] => 1
  3.     [id] => 1
  4.     [1] => DyNaMiT
  5.     [name] => DyNaMiT
  6.     [2] => 3
  7.     [game] => 3
  8.     [3] => 2
  9.     [CASE type
  10. WHEN 1 THEN 1
  11. WHEN 2 THEN 2
  12. WHEN 3 THEN 3
  13. ELSE 4 END] => 2
  14. )

Вроде как все работает. Но мне нужно что бы выводило по типу такого:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, name, game,
  2. CASE type
  3. WHEN 1 THEN (SELECT COUNT(id) FROM dynamit_tournaments_teams_1 WHERE id_tour=1)
  4. WHEN 2 THEN (SELECT COUNT(id) FROM dynamit_tournaments_teams_2 WHERE id_tour=2)
  5. WHEN 3 THEN (SELECT COUNT(id) FROM dynamit_tournaments_teams_3 WHERE id_tour=3)
  6. ELSE (SELECT COUNT(id) FROM dynamit_tournaments_teams_4 WHERE id_tour=4) END
  7. FROM dynamit_tournaments WHERE id='1'

CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => 1
  3.     [id] => 1
  4.     [1] => DyNaMiT
  5.     [name] => DyNaMiT
  6.     [2] => 3
  7.     [game] => 3
  8.     [3] => 0
  9.     [CASE type
  10. WHEN 1 THEN (SELECT COUNT(id) FROM dynamit_tournaments_teams_1 WHERE id_tour=1)
  11. WHEN 2 THEN (SELECT COUNT(id) FROM dynamit_tournaments_teams_2 WHERE id_tour=2)
  12. WHEN 3 THEN (SELECT COUNT(id) FROM dynamit_tournaments_teams_3 WHERE id_tour=3)
  13. ELSE (] => 0
  14. )

Уже показывает 0, хотя в каждой таблице создал по 1 записи. Народ, помогите как мне такое реализовать?
2. imya - 15 Января, 2014 - 09:08:49 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT top 10 itemid, itemname,
  2. case itemid
  3.   when '01.01.01.01.0010' then (SELECT sum(COSTAMOUNTPOSTED) FROM INVENTTRANS WHERE INVENTTRANS.itemid ='01.01.01.01.0010')
  4.   else 0
  5.  end
  6.  FROM INVENTTABLE


Как пример.
В вашем случае проверяйте фильтры where, скорее всего из-за них выводится 0 записей.
3. EuGen - 15 Января, 2014 - 09:21:53 - перейти к сообщению
Зачем CASE? Можно просто подставить значение в подзапрос. Ещё правильнее - сделать соответствующий JOIN, иметь одну таблицу и добавить в неё колонку для выбираемого типа.
4. imya - 15 Января, 2014 - 09:51:16 - перейти к сообщению
EuGen пишет:
Ещё правильнее - сделать соответствующий JOIN

Вы имеете ввиду 3 джойна к каждой таблице ?
5. EuGen - 15 Января, 2014 - 09:53:37 - перейти к сообщению
Нет. Имеется ввиду моя невнимательность (постфиксы у таблиц разные). Однако, подозреваю, выбор такой архитектуры - не лучший выбор (поскольку что, если типов будет, например, 100). Поэтому я рекомендовал бы иметь одну таблицу, в которую следовало бы добавить колонку для выбираемого типа.
6. imya - 15 Января, 2014 - 11:01:14 - перейти к сообщению
EuGen пишет:
иметь одну таблицу, в которую следовало бы добавить колонку для выбираемого типа

Соглашусь, так более разумно.
Автор, прислушайтесь Улыбка
7. SAD - 15 Января, 2014 - 11:54:02 - перейти к сообщению
EuGen пишет:
(постфиксы у таблиц разные)


я тоже было уже решил запрос выложить, но понял, что что - то тут не то
8. ridvik - 15 Января, 2014 - 12:43:14 - перейти к сообщению
Возможно вы правы. Я просто подумал что так легче будет осуществлять поиск))) а таблиц 100+ не будет таких)) может максимум 10))) и то наврятли))
(Добавление)
Ответил с небольшим косяком. Даже 10 максимум не будет)) их всего 4 типа)))

 

Powered by ExBB FM 1.0 RC1