[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сложная выборка из таблицы
DmbITpo
Здравствуйте.
у меня тут такая вот задача интересная появилась, которую никак не моуг осилить, может вы поможете.
есть такая таблица:
user posted image

И мне нужно из неё вытаскивать записи, но с опрделённым набором условий.
Т.е., например, надо выбрать все записи у которых region = 4 ИЛИ region = 13 И investor_operation = 3 И activity = 1. Для этого условия подойдёт запись с id 1.
Т.е надо что бы если несколько одинаковых полей (как regions), то ставилось ИЛИ, а между разеыми - И
Надеюсь понятно объяснил.



Спустя 1 час, 34 минуты, 9 секунд (16.04.2010 - 02:02) John_761 написал(а):
?
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.с



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. кстати твой запрос не сработает

Спустя 1 минута, 43 секунды (16.04.2010 - 04:55) maxims написал(а):
почему? blink.gif

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

Спустя 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 таких вот условий, насколько быстро выполнится запрос?

А вообще спасибо вам за идеи. перепробовал все и нашёл много интересного для себя.

Спустя 1 час, 40 минут (16.04.2010 - 13:13) DmbITpo написал(а):
Хотя как-то всё равно странно работает.

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
(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

А вот это вроде как работает =)) только вот опять же вопрос в производительности....

Спустя 2 дня, 4 часа, 17 минут, 14 секунд (18.04.2010 - 17:58) maxims написал(а):
мой запрос работает так:
1. сначала выбирает все записи удовлетворяющие условиям
2. затем группирует их по investor_id и считает количество записей каждого.
3. смотрит каких записей столько же сколько и условий.

В нашем случае три условия, соответственно если запись выбрана три раза значит все три условия выполнились.

З.Ы.: если в таблице есть дубликаты, то запрос будет работать не верно, ещё если в условии указывать диапазон значений (типа a>1 и a<4), то тож работает не верно.
Быстрый ответ:

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