SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.06.2011 20:01:13

alesto
Участник
Зарегистрирован: 27.01.2011
Сообщений: 19

else if внутри where

ЗДравствуйте подскажите пожалуйста можно ли использовать конструкцию else if внутри where?

Неактивен

 

#2 06.06.2011 20:44:30

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: else if внутри where

Можно. Просмотрите, например, вот этот пост


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 06.06.2011 23:17:35

alesto
Участник
Зарегистрирован: 27.01.2011
Сообщений: 19

Re: else if внутри where

Спасибо! но это не совсем то что мне нужно. Мне нужно выполнить именно if\else if\else и при каждой истине увеличивать переменную на 1.ПРобовал сделать как в официально документации, выдало ошибку.

Неактивен

 

#4 06.06.2011 23:31:57

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: else if внутри where

Честно говоря, не вполне понимаю, что Вы хотите smile. Приведите таблицу, данные, и результат, который Вам нужен. Насчет ошибки - какой именно запрос в какой таблице Вы пробовали, и какую ошибку оно выдало?

Отредактированно deadka (06.06.2011 23:32:08)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 07.06.2011 00:11:26

alesto
Участник
Зарегистрирован: 27.01.2011
Сообщений: 19

Re: else if внутри where

допустим у нас есть очень простая таблица в которой есть 2 столбца action и profile_id.
Если у 2х соседних записей в выборке Action и profile_id одинаковые то мы считаем их как одну единицу контента.
Например у нас есть вот такая табличка
action_id profile_id
add              1
add              1
update          2
delete           3
При выборе 2х единиц контента мы выберем 3 первых записи.Т.к. у первой и второй записи action и profile_id одинаковые
Сделать такой запрос очень просто достаточно добавить в where
select *
FROM (подзапрос) As t1
WHERE     
      (@b:=t1.profile_id)+
      (@a:=t1.action)+
      (@count:=@count+if(@a<>t1.action or @b<>t1.profile_id,1,0))
AND
    @count < 5 // 4 единицы контента
LIMIT
    $offset,500;
НО мне нужно чтобы при определённом значении action он не объеденял записи в единицу контента. Допустим этот Action должен называться order.
Меняем условие на следующее
(@b:=t1.profile_id)+
(@a:=t1.action)+
(@count:=@count+if(@a<>t1.action or @b<>t1.profile_id or @a='action',1,0))
И оно не работает увеличивая count вместо 1 на 2. Вот я и подумал разделить это на 2 условия используя if \ else if

Неактивен

 

#6 07.06.2011 14:04:41

alesto
Участник
Зарегистрирован: 27.01.2011
Сообщений: 19

Re: else if внутри where

Уважаемые администраторы форума! возможно ли мне создать новую тему в ветке посвящённой програмированию, чтобы мне помогли с запросом? Спрашиваю разрещения так как обычно администраторы форумов не любят когда плодят дубли.

Неактивен

 

#7 07.06.2011 21:51:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: else if внутри where

Создавать новую тему скорее не стоит - если администраторы сочтут нужным, то просто перенесут тему в другой раздел.

Не очень понятно то, что Вы делаете в запросе - сначала присваиваете переменным @a и @b значения, а потом делаете сравнения - ведь условие if в таком виде никогда не выполнится. Тут скорее нужно что-то вроде

CREATE TABLE `t_4341` (
  `action_id` varchar(255),
  `profile_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
insert into `t_4341` values('add',1),('add',1),('update',2),('delete',3);

SET @a='',@b=0,@count=0; SELECT t1.*,@count:=@count+IF(@a<>t1.action_id OR @b<>t1.profile_id,1,0) as c,@b:=t1.profile_id,@a:=t1.action_id,@count FROM (select * from t_4341 order by 1,2) AS t1 WHERE @count < 5;



Перенести все эти вычисления переносить в условие where, чтобы при этом оно корректно работало (не забываем про то, что оптимизатор при невыполнении какого-либо условия остальные просто не будет вычислять!) - тоже как-то плохо получается. Но так как я привел - работать будет.

А вообще не лучше ли было бы вместо этого шаманства с переменными сгруппировать по полям action_id и profile_id?
То есть потанцевать уже от
select action_id,profile_id,count(*) from t_4341 group by action_id,profile_id order by 1,2;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 08.06.2011 13:06:58

alesto
Участник
Зарегистрирован: 27.01.2011
Сообщений: 19

Re: else if внутри where

Вариант который я написал выше работает. Мне нужно его модифицировать добавив чтобы при определённом значении Action он не делал групировку.
Если же сделать как Вы написали то получится что я не выберу значения которые мне нужны, они просто пропадут из-за group by.

Неактивен

 

#9 08.06.2011 13:14:56

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: else if внутри where

Ваш вариант запроса вернул empty set. Приведите пожалуйста дамп Вашей таблицы (и структура и данные) и запрос, который Вы запускаете.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#10 08.06.2011 14:59:34

alesto
Участник
Зарегистрирован: 27.01.2011
Сообщений: 19

Re: else if внутри where

Запрос который Вы написали практически 1 в 1 как мой. Подскажите пожалуйста как его модифицировать чтобы он не группировал данные если action='order' или Action='add order'.

Структура таблицы
id(primary key)
action_id
profile_id

4 первых записи из таблицы
action_id profile_id
add              1
add              1
update          2
delete           3

Неактивен

 

#11 08.06.2011 15:08:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: else if внутри where

Внешне похож, согласен, но у Вас проводятся вычисления в переменные иначе.

mysql> CREATE TABLE `t_4341` (id int primary key,   `action_id` varchar(255),   `profile_id` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into `t_4341` values(1,'add',1),(2,'add',1),(3,'update',2),(4,'delete',3);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * FROM t_4341 As t1 WHERE            (@b:=t1.profile_id)+       (@a:=t1.action_id)+       (@count:=@count+if(@a<>t1.action_id or @b<>t1.profile_id,1,0)) AND     @count < 5;
Empty set (0.01 sec)


Приведите то же самое со своим вариантом, а то непонятно, как у Вас другой результат получается.

Отредактированно deadka (08.06.2011 15:10:21)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#12 08.06.2011 15:48:08

alesto
Участник
Зарегистрирован: 27.01.2011
Сообщений: 19

Re: else if внутри where

сделайте перед запросом Set @count = 0;
У меня получается неправильный результат когда я изменя запрос вот так
С
(@b:=t1.profile_id)+       (@a:=t1.action_id)+       (@count:=@count+if(@a<>t1.action_id or @b<>t1.profile_id,1,0)
На
(@b:=t1.profile_id)+       (@a:=t1.action_id)+       (@count:=@count+if(@a<>t1.action_id or @b<>t1.profile_id or action='order' or action='add order',1,0)

Неактивен

 

#13 08.06.2011 15:52:45

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: else if внутри where

Выведите переменную @count в списке запрашиваемых параметров. вот так:

SET @count=0;SELECT t1.*,@count FROM t_4341 AS t1 WHERE (@b:=t1.profile_id) + (@a:=t1.action_id) + (@count:=@count+IF(@a<>t1.action_id or @b<>t1.profile_id,1,0)) AND @count < 5;


Мне почему-то кажется, что ее значение должно увеличиваться со временем, если исходить из логики запроса (иначе зачем условие where @count<5).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#14 08.06.2011 16:14:56

alesto
Участник
Зарегистрирован: 27.01.2011
Сообщений: 19

Re: else if внутри where

Я так делал ранее. Вы наверное не совсем поняли какой результат я хочу получить.
Мне нужно чтобы групировались строки(не увеличивался счётчик @count) если у соседних строк одинаковый action и profile_id,и чтобы они не групировали если Action = order или add order.
Способ который я указал величивает счётчик как то странно, постоянно на 2 а может и на 6. Не понятно вообщем.

Неактивен

 

#15 09.06.2011 09:23:02

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: else if внутри where

Приведите пожалуйста пример данных в таблице (со всяческими action = order и action = 'add order') и итоговую выборку, которую Вы хотите получить, не очень понимаю, как именно Вы хотите группировать строки.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson