Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL Помогите составить запрос

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Открыть новую тему     Написать ответ в эту тему

Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xerpal

Цитата:
целым или пустой строкой

целым числом? скорее строчным целочисленным числом.
 
числа из какого диапазона?
 
попробуйте
 
SELECT * FROM table ORDER BY field * 1
 
как вариант  (не проверял)
SELECT * FROM table ORDER BY CASE WHEN field IS NULL THEN -1 ELSE field * 1 END
 

Всего записей: 15591 | Зарегистр. 20-09-2014 | Отправлено: 09:17 15-01-2015 | Исправлено: Mavrikii, 09:29 15-01-2015
xerpal



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
SELECT * FROM table ORDER BY field * 1

О, это умножение? Если пустую строку умножить на 1 mysql выдает один?  
 

Цитата:
SELECT * FROM table ORDER BY CASE WHEN field IS NULL THEN -1 ELSE field * 1 END

Не, эти все сложности уже не прокатят, это популярная CMS, где запрос запрятан так глубоко, что его два часа с фонарем искать надо - чтобы хотя бы глянуть, какой вывод. Вот первый вариант попробую, спасибо.
Если я его правильно понял.

Всего записей: 1633 | Зарегистр. 08-10-2011 | Отправлено: 21:18 15-01-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xerpal

Цитата:
Если пустую строку умножить на 1 mysql выдает один?  

ноль
 
можно и как обычно - CAST(field AS UNSIGNED)

Всего записей: 15591 | Зарегистр. 20-09-2014 | Отправлено: 21:21 15-01-2015 | Исправлено: Mavrikii, 21:27 15-01-2015
Fanat Andrew



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть таблицы:  
CLIENTS поля ID, BONUS_BALANCE
ORDERS поля ID, CLIENTID, TARIF_ID
CLIENT_BONUS_OPER поля ID, CLIENTID, ORDERID, SUMM
 
Надо CLIENTS.BONUS_BALANCE уменьшить последовательно на величину CLIENT_BONUS_OPER.SUMM у тех CLIENTS.ID у которых ORDERS.TARIF_ID равен определенному значению.
CLIENTS.ID, ORDERS.CLIENTID, CLIENT_BONUS_OPER.CLIENTID равны
ORDERS.ID, CLIENT_BONUS_OPER.ORDERID равны
 
После уменьшения необходимо удалить строки из CLIENT_BONUS_OPER которые принимались к вычету

Всего записей: 84 | Зарегистр. 14-03-2006 | Отправлено: 12:05 22-01-2015
xerpal



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
как вариант  (не проверял)  SELECT * FROM table ORDER BY CASE WHEN field IS NULL THEN -1 ELSE field * 1 END

Почти подошло, только немного не так, а  
SELECT * FROM table ORDER BY CASE WHEN field='' THEN 1 ELSE field * 1 END
 
В итоге сначала идут целые числа, потом пустая строка, а потом нули.  
 
Спасибо за подсказку. Вообще не знал даже, что подобные конструкции CASE ... WHEN ... ELSE ... END в mysql есть - вот что значит учебник не дочитать. ))
 

Всего записей: 1633 | Зарегистр. 08-10-2011 | Отправлено: 10:39 25-01-2015 | Исправлено: xerpal, 10:47 25-01-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xerpal

Цитата:
SELECT * FROM table ORDER BY CASE WHEN field='' THEN 1 ELSE field * 1 END

ну вы же сказали  

Цитата:
причем пустая строка должна идти выше нуля.

я подумал, что у вас есть поля с NULL

Всего записей: 15591 | Зарегистр. 20-09-2014 | Отправлено: 22:00 25-01-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, помогите составить запрос счетчика. Просто не получается впихнуть всё в 1н запрос... Если создавать каждый запрос отдельно, так это будет много запросов... Т.е. помимо этих, у меня будет такой-же только ещё с date < strtotime(date("d F Y") ." 0 hours 0 minutes 0 seconds"), так это уже 6 запросов. А там ещё будет 5-7.... Как можно объединить такого вида запросы?
 
Суть запроса:
1. Посчитать сумму чисел money, где valute = "USD", valute="RUB", valute="UAH" (в разные массивы)
 
Схема БД:

Код:
valute|money|date
USD|15|mktime()
USD|3|mktime()
RUB|35|mktime()
UAH|24|mktime()

 
Необходимый результат:

Код:
USD = 28
RUB = 35
UAH = 24


Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 19:13 03-02-2015
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
select valute, sum(money) from table group by valute

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 19:30 03-02-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
не то чуточку....
а можно как-то добавить as? чтоб не использовать while()

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 19:38 03-02-2015 | Исправлено: Sutar, 19:51 03-02-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
а можно как-то добавить as

можно, as писать вообще необязательно

Всего записей: 15591 | Зарегистр. 20-09-2014 | Отправлено: 20:02 03-02-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, помогите доделать запрос.
 

Код:
SELECT DISTINCT `tpos`, `id`, `status`, `tclass`, `name`, `map`, `player`, `maxplayer` FROM `server` WHERE `tdate` > '". time() ."' LIMIT 12

 
необходимо вывести в результате все возможные записи с БД, да так, чтоб tpos не совпадали.
Но запрос не работает, в то время, как работает:
 

Код:
SELECT DISTINCT `tpos` FROM `server` WHERE `tdate` > '". time() ."' LIMIT 12

 
И такой вопрос, как лучше реализовывать код. У меня есть 12 блоков, в которых необходимо вывести информацию. Сейчас данный метод реализовывается в такой последовательности.
 

Код:
$server_top = Array();
 
$connect_top = mysql_query("SELECT ... LIMIT 12");
while($serv = mysql_fetch_object($connect_top))
{
    $server_top[$serv->tpos] = "Тут информация о блоке.... HTML вида";
}
 
for($i = 1; $i <= 12; $i++)
{
    if(!isset($server_top[$i]))
        echo "Блок пустой, сервера отсутствует";
    else
        echo $server_top[$i];
}

 
или лучше реализовать так, чтоб в цикле for(), мы соединялись с БД, и искали там запись с tpos = $i, и если находили, выводили.... Тут не будет флуда в БД? т.е. 12 запросов в одном цикле....

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:02 13-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
Но запрос не работает, в то время, как работает

потому что DISTINCT распространяется на все столбцы перечисленные справа от него.
проще
SELECT `tpos`, `id`, `status`, `tclass`, `name`, `map`, `player`, `maxplayer` FROM `server` WHERE `tdate` > '". time() ."' GROUP BY tpos LIMIT 12
 

Цитата:
Сейчас данный метод реализовывается в такой последовательности.

выбрать все, что нужно с помощью WHERE tpos IN (1,3,4 и так далее), а потом уже обработать полученный массив

Всего записей: 15591 | Зарегистр. 20-09-2014 | Отправлено: 01:36 14-03-2015 | Исправлено: Mavrikii, 01:37 14-03-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
потому что DISTINCT распространяется на все столбцы перечисленные справа от него.  
проще  

если в БД будет две записи tpos = 4 или 8 или любое другое значение, мы не получим 12 записей с tpos от 1 до 12. (Будет от 1 до 11)
 

Цитата:
выбрать все, что нужно с помощью WHERE tpos IN

будет аналогично...

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 18:03 14-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
будет аналогично

Тогда я не понимаю первоначального вопроса - где там 12 запросов к базе???
Конечно лучше выбрать одним запросом все, а потом отпарсить.
 

Цитата:
если в БД будет две записи tpos = 4 или  

Поясню еще раз - в вашем случае distinct применяется ко всем указанным столбцам.
То есть вот эти два запроса - идентичны

Код:
SELECT DISTINCT c1, c2, c3 FROM t1
WHERE c1 > const;
 
SELECT c1, c2, c3 FROM t1
WHERE c1 > const GROUP BY c1, c2, c3;

 
И если всего 2записи, то зачем 12? Либо снова ваш вопрос не совсем внятен, поэтому покажите с примерами.

Всего записей: 15591 | Зарегистр. 20-09-2014 | Отправлено: 19:04 14-03-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Задача: Необходимо вывести 12 записей с БД, где tpos = номера записи (1, 2, 3, ..., 12)
Проблема: Если в БД будет две записи с tpos = 3 (или любое другое совпадение), последнею (т.е. 12-цетую запись с tpos = 12) просто не будет искать. Т.к. LIMIT = 12;
Нужно вывести с БД записи так, чтоб tpos не повторялся.
 
Приведу пример с 5 записями:
 

Код:
id|tpos
12|1
76|2
96|3
33|4
72|4
84|5

 
в результате, с LIMIT 5 в массив запишутся следующие ID
Array(12, 76, 96, 33 (потом перепишет в 72), null);
и в результате из 5 записей в массив запишется всего 4.

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 20:46 14-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
и в результате из 5 записей в массив запишется всего 4.

с чего бы??  
 
   
 
проблема в вашей обработке результатов, потому что выбираете все, а цикл расчитан на фиксированные 12 лупов.
поэтому когда выводятся одинаковые tpos, то и два раза переписывается один элемент массива, оставляя последнее место пустым.
 
но это к sql запросу не имеет никакого отношения.

Всего записей: 15591 | Зарегистр. 20-09-2014 | Отправлено: 20:56 14-03-2015 | Исправлено: Mavrikii, 20:58 14-03-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
но это к sql запросу не имеет никакого отношения.

вы правильно поняли. Но я знаю, что в запросе нет ошибок. Но как можно убрать в запросе, повторение tpos? GROUP BY убирает повторение tpos?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:15 14-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
GROUP BY убирает повторение tpos?

да, tpos будет уникальным. но это не гарантирует выборку нужной записи из строк с одинаковым tpos.
поэтому нужно внятно сформулировать какого результата хотите добиться, указать поля и данные в них.

Всего записей: 15591 | Зарегистр. 20-09-2014 | Отправлено: 21:17 14-03-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
но это не гарантирует выборку нужной записи из строк с одинаковым tpos.  

Это меня уже мало волнует) В поставленной задаче, главное было исправить, чтоб все элементы массива были записаны корректно)

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:40 14-03-2015
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А как сделать запрос, чтоб посчитать количество записей, где повторяется id?
 
например:

Код:
...|id|...
...|1|...
...|1|...
...|3|...
...|3|...
...|2|...
...|1|...

 
чтоб результат был
id с 1 = 3
id c 2 = 1
id c 3 = 2

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 22:14 26-03-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL Помогите составить запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru