![]() |
|
Модераторы: skyboy |
![]()
|
|
| Aliance |
|
||||||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: нет Всего: 137 |
Имеет таблицу вида:
Имеем функцию, которая на входе получает 4 параметра всегда, а на выходе должна вернуть значение из таблицы, наиболее удовл. выборке. Например что-то типа:
Выборка идет такая:
То есть если значение NULL - подразумевается, что это маска * для любого числа. В общем-то можно сделать нужный мне запрос через комбинацию 8 union`ов, но это слишком мне кажется неправильным. Это сообщение отредактировал(а) Aliance - 11.4.2012, 09:34 |
||||||
|
|||||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: нет Всего: 137 |
Таковым было и мое первое предположение, но оказалось, что оно неработоспособное.
При предложенном тобой запросе функция:
вернет первые три строчки, а должен только вторую (т.е. 80), т.к. она более релевантна. Была идея выставлять веса, которую я реализовал в варианте решения с union`ом, дальше сортировать по весам и делать limit 1. Но, повторюсь, такое решение кажется мне не совсем удачным. Это сообщение отредактировал(а) Aliance - 11.4.2012, 10:36 |
|||
|
||||
| Aliance |
|
||||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: нет Всего: 137 |
В общем расскажу как я решил задачу, может быть это натолкнёт кого-то на более разумное решение.
У меня есть 5 параметров, один из них заполнен всегда, остальные могут быть null - что фактически означает "любой"
Грубо говоря табличка комиссий. То есть например мы хотим узнать какая комиссия у пользователя 1 на его сервисе 2 с номером 3 - это будет 90%. А если на любых номерах - то 80%. Итого у нас получается 5 параметров. То есть варинтов комбинаций этих параметров - !5 = 15. Я сделал 15 union`ов, выставляя каждому вес (приоритет). Например самый большой приоритет у той записи, в которой заполнены все 5 параметров (приоритет = 15). Самый маленький приоритет у той записи, у который заполнен только первый параметр (приоритет 1). Дальше делаю order by priority limit 1. Вот код с юнионами:
Знаю, что извращение, но пока не придумал способа изящнее - этот работает. Вопрос вот в чем - а есть ли он, способ изящнее? Это сообщение отредактировал(а) Aliance - 11.4.2012, 11:58 |
||||
|
|||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
вобщета - две
Добавлено через 6 минут и 28 секунд Но вообще - по хорошему, ваш подход предпочтительнее наверное будет. Он, в отличии от предложенного мной сможет задействовать индексы.. Только вместо union используйте union all. А еще лучше это все делать не одним запросом а несколькими. Останавливаясь, когда результат получен. Добавлено через 11 минут и 40 секунд Я предполагал, что этот ордербай надо добавить к where, хотя и без него работать будет. И, пожалуй столь же мало эффективно как без where Добавлено через 13 минут и 31 секунду И, да, вместо еденичек в кейсе ордербая, можно добавить веса 1,2,4,8... -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Garcian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Я чего то не понял, это Вы как посчитали? --------------------
Неродивый студент |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: нет Всего: 137 |
Garcian, теория вероятности, раздел комбинаторика.
|
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Aliance, так то вообще, с комбинаторной точки зрения, для пяти параметров - 31 комбинация (если исключить случай, когда все is null)
Другое дело, если у вас могут быть исключены какие то комбинации(поле определено как not null). Но тут уже отсыл не к комбинаторике Это сообщение отредактировал(а) Zloxa - 13.4.2012, 11:49 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: нет Всего: 137 |
||||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Да, вы об этом говорили, не углядел, сорри. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |