![]() |
|
Модераторы: skyboy |
![]()
|
|
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Добрый день!
Пишу скрипт на php, но хотелось бы решение вопроса на mysql, поэтому вопрос в этом разделе. Скрипт получает от пользователя значения data_id, например: 0, 1, 2. Есть таблица с полями: data_id, value (оба целочисленные, оба не уникальные). Необходимо выбрать одно значение data_id, для которого сумма value будет минимальна. Делаю так:
Все ок, но есть одна очевидная проблема - это не будет работать, если записей с указанными data_id нет в таблице (тему валидации их значений затрагивать не будем, считаем что данные верны). Как быть? Данные data_id получаем от пользователя, таблицы с ними (чтоб заджойнить) нету, и делать ее под эту задачу не очень хочется. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 2 Всего: 386 |
maxipub, Вообще-то работать будет. Ну нету какого то ID, найдетcя другой. Если за параметры отвечает пользователь - он сам и виноват в полученом результате.
Если проблема в валидации данных пользователя, то все тоже несложно
Количество строк ответа должно совпасть с количеством разных параметров -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
ksnk, видимо не до конца ясно описал. Суть в том, что данные на входе в запрос валидные 100%, т.е. с ними надо считаться. Если какого-то id нет в таблице, это по сути означает что для него SUM(value) = 0. Вот что нужно.
data_id, value 0, 10 0, 20 2, 30 SELECT с data_id IN (0, 1, 2) в данном случае должен нам вернуть data_id=1, т.к. если так можно сказать, SUM(value) = 0. Добавлено через 1 минуту и 15 секунд Если нету такого ID, его SUM(value) считаем = 0. Но этот ID не игнорируем! Там вообще все value целочисленные, следовательно любой отсутствующий ID - наш потенциальный "клиент". Добавлено через 1 минуту и 59 секунд Тьфу! "Там вообще все value целочисленные" - не просто целочисленные. а положительные значения, >= 0. |
|||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 5 Всего: 17 |
maxipub, если у вас есть таблица, где хранится уникальный индекс, соответствующий data_id, то вам нужно сделать к этой таблице left join table по этому индексу и будет вам счастье ...
Добавлено через 5 минут и 18 секунд Вот, пример для моей базы:
Добавлено через 8 минут и 44 секунды а, у вас сумма ... ну переделаете на sum() и добавить сортировку и лимит 1 -------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
||||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 2 Всего: 386 |
Возможно, можно сформировать VIEW со всеми необходимыми параметрами и 0-ми значениями, объединенный с основной таблицей. Потом с этой вьюшкой и делать группировку с суммированием. Хотя, не очень понятно, насколько это будет "неджоин"?
Это сообщение отредактировал(а) ksnk - 14.4.2016, 17:11 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 5 Всего: 17 |
а если union использовать? ... утром приду на работу, проверю идею ...
-------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| Zloxa |
|
||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
я правильно понимаю, перечисление в in вы формируете динамически? Если да, наверное, вам не сложно будет сфомрировать и подобное выражение
ну и, теперь есть с чем сделать внешнее соединение
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||
|
|||||
| maxipub |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Опять не совсем точно изложился. Я не нехочу джойнов, я не хочу лишние новые таблицы заводить для этих джойнов. Правильно. То что надо! Я понимал что надо как-то сформировать параметры "временной таблицы" и заджойнить ее. Идея вертелась, но никогда так не делал. Все не мог догнать как это можно сделать, теперь все понятно! Почитал еще раз ман, правильно ли я понимаю, что вместо:
можно написать просто:
(без from dual) и никаких проблем не будет, одно и то же? |
||||
|
|||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Полагаю что да, но, как по мне, с from dual прикольнее - читаемее. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |