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

И мне нужно из неё вытаскивать записи, но с опрделённым набором условий.
Т.е., например, надо выбрать все записи у которых region = 4 ИЛИ region = 13 И investor_operation = 3 И activity = 1. Для этого условия подойдёт запись с id 1.
Т.е надо что бы если несколько одинаковых полей (как regions), то ставилось ИЛИ, а между разеыми - И
Надеюсь понятно объяснил.
Спустя 1 час, 34 минуты, 9 секунд (16.04.2010 - 02:02) John_761 написал(а):
?
BETWEEN задает диапазон
SELECT * FROM table WHERE (region = 4 OR region = 13) AND investor_operation = 4 AND activity = 1
BETWEEN задает диапазон
SELECT * FROM table WHERE (region BETWEEN 4 AND 13) AND investor_operation = 4 AND activity = 1
Спустя 2 часа, 28 минут, 17 секунд (16.04.2010 - 04:30) dr_Lev написал(а):
да, действительно задачка не из повседневных... уже час голову ломаю...
может проще функцию или процедуру на мускул написать?
может проще функцию или процедуру на мускул написать?
Спустя 2 минуты, 35 секунд (16.04.2010 - 04:33) maxims написал(а):
John_761 неправельно понял задачу.....
у него нет полей region, investor_operation, activity.с
у него нет полей region, investor_operation, activity.с
SELECT *
FROM table
WHERE ((conditon='region' AND value=4) OR (conditon='region' AND value=13))
AND (conditon='investor_operation' AND value=3)
AND (conditon='activity' AND value=1)
Спустя 9 минут, 22 секунды (16.04.2010 - 04:42) dr_Lev написал(а):
придумал... можно попробовать иннер джоином выбрать
SELECT t_1.investor_id
(SELECT investor_id FROM table WHERE condition = 'region' AND value in (4,13)) t_1 /* тут будет таблица с ид 1, 2 */
INNER JOIN
(SELECT investor_id FROM table WHERE condition = 'investor_operation' AND value in (3)) t_2 /* тут будет таблица с ид 1, 2 */
ON t_1.investor_id = t_2.investor_id
INNER JOIN
(SELECT investor_id FROM table WHERE condition = 'activity' AND value in (1)) t_3 /* тут будет таблица с ид 1 */
ON t_2.investor_id = t_3.investor_id
Спустя 6 минут, 45 секунд (16.04.2010 - 04:49) maxims написал(а):
dr_Lev накрутил то как))))))
ещё так можно:
ещё так можно:
SELECT *
FROM table
WHERE (conditon='region' AND value IN (4,13))
AND (conditon='investor_operation' AND value=3)
AND (conditon='activity' AND value=1)
Спустя 4 минуты, 34 секунды (16.04.2010 - 04:53) dr_Lev написал(а):
maximsсам в шоке... но чую, что есть решение проще моего...
P.S. кстати твой запрос не сработает
P.S. кстати твой запрос не сработает
Спустя 1 минута, 43 секунды (16.04.2010 - 04:55) maxims написал(а):
почему?

Спустя 1 минута, 40 секунд (16.04.2010 - 04:57) maxims написал(а):
а может ты и прав....

Спустя 23 минуты, 30 секунд (16.04.2010 - 05:20) maxims написал(а):
это работает тож)))
SELECT r.`investor_id`
FROM ( SELECT *, count(`investor_id`) AS max_count
FROM `t1`
WHERE (`condition`='region' AND `value` IN (4,13))
OR (`condition`='investor_operation' AND `value`=3)
OR (`condition`='activity' AND `value`=1)
GROUP BY `investor_id`
ORDER BY max_count DESC) r
LIMIT 1
Спустя 6 минут, 4 секунды (16.04.2010 - 05:26) dr_Lev написал(а):
нет, так просто выдаст максимальное совпадение по условиям... попробуй подставь region in (4,5) и activity in (2). Выдаст скорее всего 2, а может и 1... хотя на самом деле ничего не должно выдать, т.к. подходящего id в базе нет
Спустя 9 минут, 54 секунды (16.04.2010 - 05:36) maxims написал(а):
тогда так)))))))
выведит только те где все три условия выполнятся ))))))
SELECT r.`investor_id`
FROM (SELECT *, count(`investor_id`) AS max_count FROM `t1`
WHERE (`condition`='region' AND `value` IN (4,13))
OR (`condition`='investor_operation' AND `value`=3)
OR (`condition`='activity' AND `value`=1) GROUP BY `investor_id`) r
WHERE r.max_count=3
выведит только те где все три условия выполнятся ))))))
Спустя 5 часов, 56 минут, 29 секунд (16.04.2010 - 11:33) DmbITpo написал(а):
maxims в последнем запросе 3 - это кол-во условий, которые накладываются на разные значения condition?
Вроде как работает такой запрос, только вот вообще не могу вкурить как =))
А что по поводу производительности такого запроса? Если тут будет около 10 таких вот условий, насколько быстро выполнится запрос?
А вообще спасибо вам за идеи. перепробовал все и нашёл много интересного для себя.
Вроде как работает такой запрос, только вот вообще не могу вкурить как =))
А что по поводу производительности такого запроса? Если тут будет около 10 таких вот условий, насколько быстро выполнится запрос?
А вообще спасибо вам за идеи. перепробовал все и нашёл много интересного для себя.
Спустя 1 час, 40 минут (16.04.2010 - 13:13) DmbITpo написал(а):
Хотя как-то всё равно странно работает.
Выводит запись с ид 1
а вот запрос
Не выводит ничего
На что влияет этот параметр max_count?
SELECT r.`investor_id`
FROM (SELECT *, count(`investor_id`) AS max_count FROM `tbl_investor_conditions`
WHERE (`condition` = 'region' and `value` IN ('4')) GROUP BY `investor_id`) r WHERE r.max_count=1
Выводит запись с ид 1
а вот запрос
SELECT r.`investor_id`
FROM (SELECT *, count(`investor_id`) AS max_count FROM `tbl_investor_conditions`
WHERE (`condition` = 'region' and `value` IN ('4', '5')) GROUP BY `investor_id`) r WHERE r.max_count=1
Не выводит ничего
На что влияет этот параметр max_count?
Спустя 27 минут, 29 секунд (16.04.2010 - 13:40) DmbITpo написал(а):
Цитата (dr_Lev @ 16.04.2010 - 01:42) |
придумал... можно попробовать иннер джоином выбрать SELECT t_1.investor_id |
А вот это вроде как работает =)) только вот опять же вопрос в производительности....
Спустя 2 дня, 4 часа, 17 минут, 14 секунд (18.04.2010 - 17:58) maxims написал(а):
мой запрос работает так:
1. сначала выбирает все записи удовлетворяющие условиям
2. затем группирует их по investor_id и считает количество записей каждого.
3. смотрит каких записей столько же сколько и условий.
В нашем случае три условия, соответственно если запись выбрана три раза значит все три условия выполнились.
З.Ы.: если в таблице есть дубликаты, то запрос будет работать не верно, ещё если в условии указывать диапазон значений (типа a>1 и a<4), то тож работает не верно.
1. сначала выбирает все записи удовлетворяющие условиям
2. затем группирует их по investor_id и считает количество записей каждого.
3. смотрит каких записей столько же сколько и условий.
В нашем случае три условия, соответственно если запись выбрана три раза значит все три условия выполнились.
З.Ы.: если в таблице есть дубликаты, то запрос будет работать не верно, ещё если в условии указывать диапазон значений (типа a>1 и a<4), то тож работает не верно.