[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить запрос
Страницы: 1, 2
GET
Привет.

Есть таблица tab c полями id/name:

1, Алексей
2, Сеня
3, Андрей
4, Саша
5, Сева
6, Стив
7, Майкл


и вот такой запрос:


mysql_query
(SELECT
COUNT(*),
IF(`name` LIKE ("а%"),1,0) as f1,
IF(`name` LIKE ("с%"),1,0) as f2
FROM `tab` WHERE `name` LIKE 'а%' OR `name` LIKE 'с%');


Задача такая, чтоб вместе с получением количества строк COUNT(*), пришли переменные f1 и f2, которые принесут инфу среагировал ли на них поиск...в идеале конечно лучше б было чтоб число сработок было, которое в сумме даст COUNT(*).

Этот запрос работает, но только с последней сработавшей строкой...
т.е. с этой таблицей он показывает всего строк:6, f1=0,f2=1....а нужно, чтоб и f1=1 было.

Отдельно 2 запроса делать не очень хочется т.к. условия могут быть из 3-5 условий...хочется сделать 1 запрос, а не 5.

Спасибо.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
kaww
Кажется так должно работать:
select count(*) as count, sum(a) as sum_a,sum(b) as sum_b 
from (
select
if
(name like('а%'), 1, 0) as a,
if(name like('бо%'),1,0) as b
from `tab`
having a=1 or b=1) as t1
GET
kaww

Спасибо!!!!!! Какой раз выручил!

Правильно ли я понял:

1. Внутреняя часть запроса:
(
select
if
(name like('а%'), 1, 0) as a,
if(name like('бо%'),1,0) as b
from `tab`
having a=1 or b=1)

как только строка найдена, то к sum(a) плюсуется, например 1, а к sum(b) 0
ищем дальше....опять нашли совпадение...опять плюсуем...0 или 1...1 или 0...
правильно?

А COUNT(*) он в конце собирается мл как?


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
kaww
ABC
суб запрос собирате таблицу вида
Цитата
a | b
0 | 1
0 | 1
1 | 0

где 1 если like сработал, затем уже sum считают ко-во строк заматченных шаблоном. count - кол-во строк удовлетворяющих хотя бы одному шаблону (кол-во строк в выборке).
GET
kaww

Спасибо еще раз!

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Еще хотел спросить, как думаете такой запрос быстрее двух простых COUNT(*)?

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
kaww
ABC
с sql не особо дружу, по этому без тестов - хз, но вроде выглядит достаточно безобидно)))
S.Chushkin
Всё проще (никаких подзапросов):
SELECT 
COUNT(*) as c,
COUNT(IF(`name` LIKE ("а%"),1,null) as f1,
COUNT(IF(`name` LIKE ("с%"),1,null) as f2
FROM `tab`
WHERE `name` LIKE 'а%' OR `name` LIKE 'с%'


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
kaww
S.Chushkin
в этом случае like ведь будет выполнятся в 2 раза большее кол-во раз? Так?
S.Chushkin
Цитата (kaww @ 9.02.2013 - 17:00)
S.Chushkin
в этом случае like ведь будет выполнятся в 2 раза большее кол-во раз? Так?

Сколько по условию (where) отберётся, столько раз каждый if(), count() будет выполнен.
В принципе это достаточно быстро.
Например, на таблице с ~1.2 млн записей с выборкой по полю с индексом разница будет 0.01-0.02 сек (запрос всего ~0.06 сек для ~150 тыс найденных/отобранных записей (с if-ами 0.08), т.е. каждый оператор будет выполнен ~150000 раз).

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
GET
S.Chushkin

f1=NULL. ? т.е. будто совпадения не было, а оно же было f1=1 должно быть

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
S.Chushkin

не...не чего то я попутал, пробую ваш пример...где-то пишет синтаксическую ошибку разбираюсь что не так

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
закрывающаяся скобка у вторых и третьего COUNT

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Результат показал:

6 6 6, а не 6 4 2

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
S.Chushkin
Цитата (kaww @ 9.02.2013 - 17:00)
S.Chushkin
в этом случае like ведь будет выполнятся в 2 раза большее кол-во раз? Так?

Кстати, никогда не используйте having без where - запрос будет считывать все записи в таблице.
Фактически, Ваш вариант выполняется в 4 раза медленнее моего варианта.
Даже если having заменить на where, Ваш вариант (с подзапросом) будет чуть медленнее (%% на 10-20). Не говоря уж о том, что он менее "красивый" smile.gif

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.