Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поможите с запросом

2.2K
31 августа 2005 года
BeOne
92 / / 15.12.2004
Есть mysql таблица вида
 
Код:
-parameter_id-|-value-|-vehicle_id-
     12       | 1967  |  5    
     12       | 1967  |  4    
     13       | Россия|  5    
     13       | США   |  4    
...

Требуется выбрать из неё vehicle_id у которого некоторые parameter_id имеют некое value. То есть, чтобы при параметрах parameter_id=12 и value=1967 и parameter_id=13 и value= Россия выборка была- vehicle_id= 5, а не 5 и 4. То есть нужно выбирать параметры с общим значением какого-то третьего параметра.
287
01 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Не могу никак переварить условие=) Вот как вариант запрос:
Код:
SELECT
  `t1`.`vechile_id`
FROM
  `vechiles` AS `t1` LEFT JOIN `vechiles` AS `t2`
ON
  (
    `t2`.`vechile_id` = `t1`.`vechile_id`
    AND
    `t2`.`parameter_id` = 13
    AND
    `t2`.`value` = 'Россия'
  )
WHERE
  `t1`.`parameter_id` = 12
  AND
  `t1`.`value` = '1967'


Можешь где опечатался.. А может и вовсе ошибся, но у себя создал таблицу, проверил— все ок. Для t1 ищешь первую пару, для t2— вторую. "Третьим" параметром, а точнее критерием отбора пар строк служит значение поля vechile_id. Если вторая половина условия не выполняется, то есть если записи где parameter_id = 13 и value = 'Россия' нет результат все-равно выберется. Если нужно изменить такое поведение, а точнее заставить запрос браковать неполные пары строк то замени LEFT JOIN на INNER JOIN.
2.2K
01 сентября 2005 года
BeOne
92 / / 15.12.2004
Акха! Условие переваренно правильно :) Спасибо. Хотя есть еще вопросик -- дело в том, что у меня таких параметров не 1 и не 2, а до десятков. Это получаеться мне каждый раз такой join делать? А по-быстрее способа нет? Просто база планируеться до 500000 масынок :) у каждой есть набор каких-то параметров(пусть ~ по 10) => табличка с параметрами будет содержать ~ 5млн записей. Это ведь как долго выборка такими join`ами будет проходить?
12K
01 сентября 2005 года
godfrey
13 / / 01.09.2005
parameter_id-|-value-|-vehicle_id-
12 | 1967 | 5
12 | 1967 | 4
13 | Россия| 5
13 | США | 4

Просто
"Select vehicle_id From table Where parameter_id = 'value' And (value = '1' Or value = '2' Or value = '3')"
2.2K
01 сентября 2005 года
BeOne
92 / / 15.12.2004
Неа, не то. Попробую еще раз объяснить чего мне надо :) Есть табла с полями parameter_id, value, vehicle_id. Из среды получаю неопределенное количесвто пар parameter_id и value. Нужно из этой таблы выбрать только те vehicle_id у которых присутствуют все такие пары(ну или не все, а допустим n-1). Каталог с параметрами и фильтрацией я делаю :) причем параметров не фиксированное количество. Зарание спасибо.
287
01 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Пока в голову ничего не пришло. А почему бы не проделать эту работу несколькими выборками?

added: А вообще лучше поподробней обрисуй структуру базы и намечаемую методику фильтрации результатов— может полегче будет вникнуть)ъ К примеру, а нужен ли parameter_id? Если это таблица параметров по авто, то parameter_id это наверное просто pk, для update'ов и delete'ов? Тогда нам нужно работать только с value и получать vechile_id. Или же это не первая, а очередная ступень в отборе, и нужно ориентироваться именно по parameter_id?

added: Все, понял в чем ошибся. Вопрос по parameter_id отпадает=))
287
01 сентября 2005 года
Shiizoo
958 / / 14.03.2004
В идеале понимаю так: ищем авто (A) марки (a) bmw (B) цвета (b) черный металлик, (c) 1997-ого (C) года выпуска, (d) такой-то (D) серии, (e) такой-то (E) модели, в (f) таком-то (F) городе, по цене (G) от (g) у.е. (H) до (h) у.е.

Значит выборку нужно организовывать примерно по такому принципу:
VID = select vechile_id from vechiles where parameter_id = A and value = a
VID = select vechile_id from vechiles where parameter_id = B and value = b and vechile_id in VID
VID = select vechile_id from vechiles where parameter_id = C and value = c and vechile_id in VID
...
VID = select vechile_id from vechiles where parameter_id = H and value = h and vechile_id in VID

Гм, кроме как join'ами или последовательными выборками даже и не знаю как сделать)ъ Вложенные селекты в счет не берем ведь ??, ну их в пень;)

А как СУБД кстати?
2.2K
01 сентября 2005 года
BeOne
92 / / 15.12.2004
Если в общих словах, то сейчас попытаюсь :)
Есть 4 основных таблы-
1- категории
2- параметры категорий
3- масынки
4- параметры масынок

Создаем категорию, создаем или наследуем для неё параметры(параметров может быть хоть сколько и все они хранятся в базе "параметры категорий").
Далее создаем масынку, заполняем её параметры(параметры берутся из параметров категории к которой относится масынка). Ну и дальше по круги или пропуская первые два у нас получается много категорий и машинок в них с разными параметрами.
Например у категории "легковые" могет быть параметры: количество ДТП, количество хозяев...-, а у категории "грузовые" могут быть параметры: страна изготовитель, обем движка...ну, не важно :)
Далее пользователь заходит в какую-нибудь категорию, например легковые и выбирает необходимые ему значения параметров. Скрипт их получает и ищет в табле "параметры машинок" совпадения. По идее надо найти такой vehicle_id у которого все эти параметры(которые выбрал пользователь) присутствуют.
Если делать несколько выборок, то пользователь встанет и уйдет :) (примерный размер базы- 500000 тс,=> примерный размер таблы параметров, > 4000000)
parameter_id здесь выступает в роли индекса, по нему идет вся основная выборка. Хотя апдейт тоже по нему-же. parameter_id наследуеся от таблы "параметр категории"- при создании машины.
Толmrj с value не получиться работать, т.к. так не узнать какой параметр имеет какое значение.
// это мне сказали подобие mobile.de написать...
2.2K
01 сентября 2005 года
BeOne
92 / / 15.12.2004
На мускуле все реализуется. Вся заковырка в том, что размер базы большой, поэтому не хотелось бы напрягать лишними select'ами. Да и при таком раскладе(особенно учитывая, что большенство значений будут не "value=90", а "value between 0 and 999", множество параметров являются диапазонами,а люди у нас любят выбирать "от и до", то затем php фильтрация займет много времени.)
12K
01 сентября 2005 года
godfrey
13 / / 01.09.2005
Я не вижу сложности в этом.
У тебя есть допустим 5 параметров авто.
Тебе надо найти тачку с такими параметрами.
Если так то все это можно сделать одним запросом на мускуль.

Select p1.id
From
table p1,
table p2,
table p3,
table p4,
table p5
Where
p1.id = p1.id And
p2.id = p1.id And
p3.id = p1.id And
p4.id = p1.id And
/*
id = vehicle_id(сократил шоб не парится)
потом циклом собираеш все свои параметры
*/
foreach($param as $param_id=>$param_value) {
$i++;
$sql.= "
p$i.parameter_id = '$param_id' And
p$i.value = '$param_value'";
};
2.2K
01 сентября 2005 года
BeOne
92 / / 15.12.2004
Агха, именно то, что нужно. Только может теперь кто скажет какой вариант быстрее работает :) Хотя, сейчас сам потестю :) Всем пасибо. Ежели еще есть идеи, пжласта -- предлогайте. %)
287
01 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Не уверен что join'ы будут работать намного быстрее, потому как могут быть ситуации когда после первого же join'а все остальные будут просто лишними. Понеятное дело что они не добавят мусора в результат, но вот перебор, не знаю его механизма, но все же какой-то будет (сверить все B с A, потом с полученным результатом еще и все C с B, потом все D с C и т.д.). Такое возможно если у нас в базе только одна лишь машинка марки toyota указанного года выпуска. Всякое ведь бывает так? Думаю такие холостые выстрелы не будут редкостью, значит select в таком случае гораздо уместнее.

Потом еще, нужно придумать как вести журнал для еще какой-никакой оптимизации выборок. Суть его заключается в том, что в нем хранятся данные по разбросу значений для определенного параметра. Можно вести такой журнал только для каждой отдельной марки автомобилей, страны или еще чего, или же для всех уровней по-отдельности.. не знаю.. Но вести это дело нужно, чтобы знать в какой последовательности выбирать, в случае последовательной выборки, или вносить в запрос, в случае использования join'ов, строки по имеющимся условиям. Может mysql И умеет делать такие оптимизации, но что-то я сомневаюсь.

Вариант ,,,,,,, ,имхо, сожрет много больше ресурсов т.к. мы получим произведение всех используемых копий таблиц, а потом из полученных результатов начнем отбирать те строки, какие нам больше приглянутся, вместо того чтоб уже на этапе вычисления произведения отбрасывать весь мусор.
287
01 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Делаю сейчас простенький тест для 500000 x 1500000. У меня кнешна не многопроцессорник с космическим железом, но для сравнения способов кое-какого думаю пойдет. В одних и тех же условиях мой вариант выигрывает в 1.5 раза, но это мой причудливый комп и тестер из меня, imho, хреновый=)ъ
338
02 сентября 2005 года
chigevara
529 / / 29.09.2003
Ааааа!!!!

Народ, вы меня пугаете :D

SELECT vehicle_id, COUNT(vehicle_id) as c FROM ... WHERE parameter_id IN() AND value IN () GROUP BY value, parameter_id, vehicle_id;

После загоняем в массив и удаляем все записи с 'c'<2, на чем собственно можно и остановиться.
2.2K
02 сентября 2005 года
BeOne
92 / / 15.12.2004
Неа, не то. При таком расскладе будем получать ошибочные данные, например если у одной машины один параметр имеет id=23 и равен 33, а другой параметр имеет id=44 и значение равное 55 при этом у второй машинки этиже параметры имеют значения 55 и 66, то по условию пройдут обе эти машинки :) В общем, не катит.
2Shiizoo, спасибо, твоим способом действительно быстрее получается :) Сейчас думаю над каим-нибудь кешированием, пока додумался лишь до записи в отдельную таблу некого хеша параметров и разультатов.
338
02 сентября 2005 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by BeOne
Неа, не то. При таком расскладе будем получать ошибочные данные, например если у одной машины один параметр имеет id=23 и равен 33, а другой параметр имеет id=44 и значение равное 55 при этом у второй машинки этиже параметры имеют значения 55 и 66, то по условию пройдут обе эти машинки :) В общем, не катит.


А ты пробовал???? Или по твоему хитрый GROUP по нескольким полям я от скуки вставил???

2.2K
02 сентября 2005 года
BeOne
92 / / 15.12.2004
Ага пробывал
Вот такой селект
 
Код:
SELECT vehicle_id, COUNT(vehicle_id) as c FROM vehicle_parameters WHERE parameter_id IN('69','68','67') AND value IN ('Пермь','234','435') GROUP BY value, parameter_id, vehicle_id;

на вот такой вот таблице
Код:
CREATE TABLE `vehicle_parameters` (
  `parameter_id` int(10) unsigned NOT NULL default '0',
  `value` varchar(255) NOT NULL default '',
  `vehicle_id` int(10) unsigned NOT NULL default '0',
  KEY `value` (`value`),
  KEY `parameter_id` (`parameter_id`)
) TYPE=MyISAM;

--
-- Дамп данных таблицы `vehicle_parameters`
--

INSERT INTO `vehicle_parameters` (`parameter_id`, `value`, `vehicle_id`) VALUES (69, 'Пермь', 7);
INSERT INTO `vehicle_parameters` (`parameter_id`, `value`, `vehicle_id`) VALUES (68, '234', 7);
INSERT INTO `vehicle_parameters` (`parameter_id`, `value`, `vehicle_id`) VALUES (67, '435', 7);
INSERT INTO `vehicle_parameters` (`parameter_id`, `value`, `vehicle_id`) VALUES (66, '334', 7);
INSERT INTO `vehicle_parameters` (`parameter_id`, `value`, `vehicle_id`) VALUES (69, 'Москва', 12);
INSERT INTO `vehicle_parameters` (`parameter_id`, `value`, `vehicle_id`) VALUES (68, '234', 12);
INSERT INTO `vehicle_parameters` (`parameter_id`, `value`, `vehicle_id`) VALUES (67, '44', 12);
INSERT INTO `vehicle_parameters` (`parameter_id`, `value`, `vehicle_id`) VALUES (66, '66', 12);


Возвращает все ряды почему-то.
287
02 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Может '... having c > 1'? Вместо того чтоб всю data с субд выкачивать, забивать ею в очередной раз память, а потом еще и отсеивать средствами какого-нить тормазнутого интерпретируемого языка. это всё imvho, imvho.. устал, может глупость горожу?

 
Код:
select *, count(*) d from b where ((b = 2 and c between 0 and 7 ) or (b =
 0 and c in ('audi'))) group by a having d > 1


a - vechile_id, b - parameter_id, c - value, d - сигнализирует о количестве условий из заданных которым отвечает данная группа строк, where b - здесь b это таблица.

В предложении having d > 1 число (единицу) нужно заменить на "количество условий минус 1", у меня условия было 2: количество аварий 'b = 2 and c between 0 and 7' от 0 до 7 и марка автомобиля 'b =
0 and c in ('audi')' audi, поэтому и единица.

Да, забыл. Условия как видно из примера нужно пихать в where, перечислять отдельные параметры через and, а варианты значений для них через or, between, in и т.п.

Не ручаюсь вообще-то за правильность, совсем, но может заработает. У себя протестить пока не могу. А вообще chigevara по-моему самый правильный курс держит, хотя это тоже imho.. ;)

added: Седня кстати первый день учился^^, в смысле вообще, в вузе) Весело, интересно, за раз препод по прогр. научил меня уважать pascal.. сижу щас зубрю;)
338
02 сентября 2005 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by Shiizoo
А вообще chigevara по-моему самый правильный курс держит, хотя это тоже imho.. ;)


Команданте лоханулся не по детски, что говорит о том что процесс взросления идет и не стоит на месте :D

SELECT DISTINCT a.vehicle_id as vehicle_id FROM vehicle_parameters a, vehicle_parameters b WHERE a.parameter_id IN('69','68','67') AND a.value IN ('Пермь','234','435') AND b.parameter_id IN('69','68','67') AND b.value IN ('Пермь','234','435') AND a.vehicle_id = b.vehicle_id ;

Работает(вроде)
По выложенному дампу возвращает 7 и 12.

287
02 сентября 2005 года
Shiizoo
958 / / 14.03.2004
О блин, всю жисть думал что транспорт это vechile..P( Будем знать.. "вехикле, вехикле".. :D

Команданте, меня терзают смутные сомнения по поводу distinct.. Не стормознет?


Что было выше:

 
Код:
select a, count(*) d from a where ((b = 0 and c = 'bmw') or (b = 1 and c = '15'))
group by a having d > 1;


Еще раз проверил, работает. Оптимальнее пока ничего не придумывается. Ковырял ковырял join'ы, и заметил что во многих случаях это один и тот же запрос что и where только немного по-разному оформленный.

ps: не бить, туплю.
338
02 сентября 2005 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by Shiizoo
Команданте, меня терзают смутные сомнения по поводу distinct.. Не стормознет?


Дык, по одному полю ведь, не должно...

287
02 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Вот и говорю: "не бить";) Надо затестить у себя твой distinct

 
Код:
a.parameter_id IN('69','68','67')
AND
a.value IN ('Пермь','234','435')
AND
b.parameter_id IN('69','68','67')
AND
b.value IN ('Пермь','234','435')


это жжж

Код:
(a.parameter_id = 69; a.value = 'Пермь')
(a.parameter_id = 69; a.value = '234')
(a.parameter_id = 69; a.value = '435')
(a.parameter_id = 68; a.value = 'Пермь')
(a.parameter_id = 68; a.value = '234')
(a.parameter_id = 68; a.value = '435')
(a.parameter_id = 67; a.value = 'Пермь')
(a.parameter_id = 67; a.value = '234')
(a.parameter_id = 67; a.value = '435')
...
(b.parameter_id = 67; b.value = '435')


Не пойму кто из вас не того ищет, или это я не того ожидаю..


В общем я думаю не протестив все варианты, хорошенько, к выводу что лучше прийти сложно. По большому счету, distinct откидывает все повторяющиеся vehicle_id.. Having с Group by несут ту же нагрузку, но...

Код:
массив строки_на_выход;
пока (результ_строка = следующая(результ_строки)) {
  флаг = 0;
  сбросить_указатель(строки_на_выход);
  пока (строка_на_выход = следующая(строки_на_выход)) {
    если
      результ_строка->vehicle_id == строка_на_выход->vehicle_id
    то флаг = 1 и выход из цикла;
  }
  если флаг == 0 то
      строки_на_выход[] = результ_строка;
}


:D ну, типа того. Я having'ом проверяю D и бракую строки сравнивая D с константой, которую задаю на этапе формирования запроса (еще за пределами субд), а distinct'у, даже если он строит какой-то индекс отбирая и бракуя строки, все же делает множество сравнений.. вот.. ну это так, мысля из воздуха, я mysql не писал - не знаю :D
287
04 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Так чем все кончилось? Самому интересно непомерно;)
2.2K
05 сентября 2005 года
BeOne
92 / / 15.12.2004
Цитата:
Originally posted by Shiizoo
Так чем все кончилось? Самому интересно непомерно;)


Закончилось тем, что я сейчас пришел на работу и буду проводить соревнования между способами. О результатах сообще дополнительно. Всем спосибо :)
// блин, трудно учится и работать, хотя труднее всеже учиться.

488
05 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by BeOne
Есть mysql таблица вида
 
Код:
-parameter_id-|-value-|-vehicle_id-
     12       | 1967  |  5    
     12       | 1967  |  4    
     13       | Россия|  5    
     13       | США   |  4    
...

Требуется выбрать из неё vehicle_id у которого некоторые parameter_id имеют некое value. То есть, чтобы при параметрах parameter_id=12 и value=1967 и parameter_id=13 и value= Россия выборка была- vehicle_id= 5, а не 5 и 4. То есть нужно выбирать параметры с общим значением какого-то третьего параметра.


 
Код:
SELECT DISTINCT p1.vehicle_id FROM vehicle_parameters p1, vehicle_parameters p2
  WHERE p1.vehicle_id=p2.vehicle_id
    AND p1.parameter_id=12 AND p1.value="1967"
    AND p2.parameter_id=13 AND p2.value="Россия"
287
05 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Цитата:
Вложенные селекты в счет не берем ведь ??, ну их в пень;)



Ответа я не видел, но напрасно, имхо, считать что он будет положительным;)

12K
06 сентября 2005 года
godfrey
13 / / 01.09.2005
Цитата:
Originally posted by Mоngооsе
 
Код:
SELECT DISTINCT p1.vehicle_id FROM vehicle_parameters p1, vehicle_parameters p2
  WHERE p1.vehicle_id=p2.vehicle_id
    AND p1.parameter_id=12 AND p1.value="1967"
    AND p2.parameter_id=13 AND p2.value="Россия"




дамс, похоже ты просто решил запостить свой вариант не прочитавне поста выше. Если что то такой вариант уже был ! ):):)

488
06 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by godfrey
дамс, похоже ты просто решил запостить свой вариант не прочитавне поста выше. Если что то такой вариант уже был ! ):):)

Это не вариант. А решение. :)

Если ты имеешь в виду это(ошибки исправлены :)),
Select p1.id
From
table p1,
table p2,
table p3,
table p4
Where
p2.id = p1.id And
p3.id = p1.id And
p4.id = p1.id

то здесь только соединения, и нет ограничений, на записи отдельных таблиц.

287
06 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Цитата:
В общем я думаю не протестив все варианты, хорошенько, к выводу что лучше прийти сложно. По большому счету, distinct откидывает все повторяющиеся vehicle_id.. Having с Group by несут ту же нагрузку, но...

...

:D ну, типа того. Я having'ом проверяю D и бракую строки сравнивая D с константой, которую задаю на этапе формирования запроса (еще за пределами субд), а distinct'у, даже если он строит какой-то индекс отбирая и бракуя строки, все же делает множество сравнений.. вот.. ну это так, мысля из воздуха, я mysql не писал - не знаю :D



Декартово произведение (слон) с прогоном where "то,сё,это" работает медленее where+group+having связки по одному экземпляру таблицы. Проверил&#151; проигрыш декартова растет с увеличением объема данных. Это про mongoose'ов вариант.;) А вообще надо проверить это дело на сильно разреженной таблице, я-то тестил на таблице где в строках просто периодически меняются значения пары столбцов;)

488
07 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Shiizoo
... Это про mongoose'ов вариант.;) А вообще надо проверить это дело на сильно разреженной таблице, я-то тестил на таблице где в строках просто периодически меняются значения пары столбцов;)

Сколько раз повторять, что это не вариант, а решение? :)

Мимоходом, можно взглянуть на супер-пупер where+group+having SELECT?

338
07 сентября 2005 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by Mоngооsе
Сколько раз повторять, что это не вариант, а решение? :)

Мимоходом, можно взглянуть на супер-пупер where+group+having SELECT?


А ты, стесняюсь спросить, топик собственно читал? Или не барское это дело :D

287
07 сентября 2005 года
Shiizoo
958 / / 14.03.2004
Цитата:
Originally posted by Mоngооsе
Сколько раз повторять, что это не вариант, а решение? :)

Мимоходом, можно взглянуть на супер-пупер where+group+having SELECT?



Хех, решение нашли сразу. По первому вопросу. А сейчас ищем способ оптимизации времени выполнения, нагрузки и т.п. В общем чем меньше напряга машине - тем лучше.

Where+group+having уже не один раз проскакивал, я даже схему работы объяснил;) Вывод - нужно читать посты треда, если постишь сам.

A&#151; таблица.
a&#151; vechile_id
b&#151; parameter_id
c&#151; value
n&#151; количество кортежей для конкретного vechile_id удовлетворяющих условию

parameter_id 1 - страна
parameter_id 2 - марка

ищем audi в России или на Украине

 
Код:
select
  a, count(*) n
from
  A
where
  (b = 1 and c = 'audi')
or
  (b = 2 and c in ('Russia','Ukraine'))
group by a
having n > 1


Единица здесь это количество условий (у нас их два к примеру) - 1. Для двух - 1, для трех - 2.. и т.п.

ps: идея команданте, додумка моя;) но все-равно кажись какой-нибудь изящный join может проделать эту работы эффективнее.
488
07 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Shiizoo
Хех, решение нашли сразу. По первому вопросу. А сейчас ищем способ оптимизации времени выполнения, нагрузки и т.п. В общем чем меньше напряга машине - тем лучше.

Where+group+having уже не один раз проскакивал, я даже схему работы объяснил;) Вывод - нужно читать посты треда, если постишь сам.

A&#151; таблица.
a&#151; vechile_id
b&#151; parameter_id
c&#151; value
n&#151; количество кортежей для конкретного vechile_id удовлетворяющих условию

parameter_id 1 - страна
parameter_id 2 - марка

ищем audi в России или на Украине

 
Код:
select
  a, count(*) n
from
  A
where
  (b = 1 and c = 'audi')
or
  (b = 2 and c in ('Russia','Ukraine'))
group by a
having n > 1


Единица здесь это количество условий (у нас их два к примеру) - 1. Для двух - 1, для трех - 2.. и т.п.

ps: идея команданте, додумка моя;) но все-равно кажись какой-нибудь изящный join может проделать эту работы эффективнее.

Я читал пред посты. И только потому предложил свое р е ш е н и е, что having+group таковым не является.
Например. для последнего варианта. Если есть 2 записи с
(b = 1 and c = 'audi') и для ОБОИХ a = 4
но нет ни одной записи
(b = 2 and c in ('Russia','Ukraine')) для которой a = 4
тогда having group вернет в качестве результата
4, хоть это будет неправильно.

488
07 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by chigevara
А ты, стесняюсь спросить, топик собственно читал? Или не барское это дело :D


Читал. А твои ответы вообще на изусть выучил. :D

287
07 сентября 2005 года
Shiizoo
958 / / 14.03.2004
ууу.. ночь, ползу спать и уже не соображаю;) у меня все варианты прежде сходились, щас больше ниче проверять уже не буду.. завтре;) почему group+having вернет? group по a = 4, считаем группу, отбрасываем по having > n и получаем то что нужно.

а вообще, во-первых where+group+having что-то стал проигрывать 1 секунду на 1,500,000 строках, но мне это уже не нравится) А твой вариант, переделанный теперь уже, это и есть inner join on .... Хоть ты и изобразил его по-другому, а mysql оптимизациями приводит его, твой запрос, и его:

Код:
--------------------------------------------------------------------------------SELECT
  `t1`.`vechile_id`
FROM
  `vechiles` AS `t1` LEFT JOIN `vechiles` AS `t2`
ON
  (
    `t2`.`vechile_id` = `t1`.`vechile_id`
    AND
    `t2`.`parameter_id` = 13
    AND
    `t2`.`value` = 'Россия'
  )
WHERE
  `t1`.`parameter_id` = 12
  AND
  `t1`.`value` = '1967'


мой первый вариант.. в общем к одному виду их приводит. если конечно left join на inner заменить как я грил. придумывался запрос когда еще сабж не был ясен.


и в общем.. в общем.. в итоге пришли к тому, что было в начале:D жаль потраченных 2-ух часов, сейчас вот, которые мог проспать.. а-то ведь скоро вставать на учебу;)
488
07 сентября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Shiizoo
ууу.. ночь, ползу спать и уже не соображаю;) у меня все варианты прежде сходились, щас больше ниче проверять уже не буду.. завтре;) почему group+having вернет? group по a = 4, считаем группу, отбрасываем по having > n и получаем то что нужно.

для a = 4 count() = 2.
Или уже и я тоже не соображаю???

287
07 сентября 2005 года
Shiizoo
958 / / 14.03.2004
это.. выше там всё что нужно. а этот.. a4..

i a b c
1 1 1 'Russia'
2 1 2 'audi'
3 2 1 'Usa'
4 2 2 'dodge
5 3 1 'Germany'
6 3 2 'audi'
7 4 1 'Ukraine
8 4 2 'audi'

по where выбираем 1,2,6,7,8
по group получаем (1,2),(6),(7,8)
по count получаем (1,2) => 2, (6) => 1, (7,8) => 2
по having получаем a = 1,4

это конечно при условии что у нас составной unique по (a,b).

ps: вот теперь сплю:angel: спокойной ночи;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог