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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
а что за Х в конце дужек?
 

Цитата:
...T `id` FROM `hosts` WHERE vip = 0 ORDER BY vote DESC)x limit 1,10....

 
это опечатка?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 01:25 16-08-2014
Sutar



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

Код:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in D:\localhost\www\new\index.php on line 65

 

Код:
line 63: $connect = mysql_query("SELECT * FROM (SELECT * FROM `server` WHERE `vip` = '1' ORDER BY `date` union SELECT * FROM `server` WHERE `vip` = '0' ORDER BY `vote` DESC) LIMIT ".(($_GET["page"]-1)*$serverlist).",$serverlist");
line 64:
line 65: while($server = mysql_fetch_object($connect))
line 66:{

 
mysql_error(): Incorrect usage of UNION and ORDER BY
 
Добавлено:
Исправил на такой вариант:
 

Код:
mysql_query("SELECT * FROM ((SELECT * FROM `server` WHERE `vip` = '1' ORDER BY `date` DESC) UNION (SELECT * FROM `server` WHERE `vip` = '0' ORDER BY `vote` DESC)) LIMIT ".(($_GET["page"]-1)*$serverlist).",$serverlist"):

 
выдает: Every derived table must have its own alias

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 11:37 16-08-2014 | Исправлено: Sutar, 11:50 16-08-2014
DrakonHaSh



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

Цитата:
это опечатка?  


Цитата:
Every derived table must have its own alias

это не опечатка, а краткая запись as x. ошибку выдает именно из за того, что вы ее убрали

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 12:21 16-08-2014
Sutar



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

Код:
SELECT * FROM ((SELECT * FROM `server` WHERE `vip` = '1' ORDER BY `date` DESC) union (SELECT * FROM `server` WHERE `vip` = '0' ORDER BY `vote` DESC))x LIMIT 1, 30

 
работает, но не совсем корректно.
Первый запрос ДО union работает отлично, показывать все vip=1 по убыванию date....
но второй вообще не сортирует...
дальше идут оставшийся запросы vip=0, но они не отсортированы по убыванию vote...
vote разбросан как попало...
 
   
 
Добавлено:

Цитата:
а краткая запись as x

зачем её делать?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 12:32 16-08-2014
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
оказывается в mysql order by работает с union только для первого подзапроса.
 
можно исхитрится так:

Код:
 
SELECT * FROM  
(
   (select * from (SELECT * FROM `server` WHERE `vip` = '1' ORDER BY `date` DESC)x1)  
   union all
   (select * from (SELECT * FROM `server` WHERE `vip` = '0' ORDER BY `vote` DESC)x2)
)x3  
LIMIT 1, 30  
 

 
 
или, другой вариант, без union, через сложный order by. для вашей таблицы так:
SELECT * FROM `server` ORDER BY if(`vip`=1, UNIX_TIMESTAMP(`date`), `vote`) DESC
 
 
 

Цитата:
а краткая запись as x
зачем её делать?

требование синтаксиса mysql. чтоб не было ошибки  
Every derived table must have its own alias

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 14:04 16-08-2014 | Исправлено: DrakonHaSh, 14:09 16-08-2014
Sutar



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

Цитата:
через сложный order by

почему сложный?
этот вид запроса будет дольше чем первый?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 14:57 16-08-2014
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нет, 99% что быстрее. сложный это я имел в виду что не простой по определенному полю, а вычисляемый.
получилось, я надеюсь, наконец ?
 
Добавлено:
if(`vip`=1, UNIX_TIMESTAMP(`date`), `vote`)  
тут не очевидный нюанс:  
UNIX_TIMESTAMP(`date`) для любого date > 1980 год будет намного больше чем vote из вашей таблицы, но если там появится мега-большой vote, то он может нарушить предполагаемою "логичность" этого выражения.

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 15:03 16-08-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
нет не поулчился

Код:
SELECT * FROM `server` ORDER BY if(`vip`=1, UNIX_TIMESTAMP(`date`), `vote`) DESC  

 
а первый запрос работает отлично. Он не создаст большой нагрузки, если ему придется сортировать больше 3-5 тыс. записей?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 16:05 16-08-2014
DrakonHaSh



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

Цитата:
нет не поулчился
SELECT * FROM `server` ORDER BY if(`vip`=1, UNIX_TIMESTAMP(`date`), `vote`) DESC

какая-то ошибка ? я у себя проверял - работает. `date` у вас имеет type datetime ? а vote имеет численный формат ?
 

Цитата:
первый запрос работает отлично. Он не создаст большой нагрузки, если ему придется сортировать больше 3-5 тыс. записей?

нет.

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 17:47 16-08-2014
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
date стоит тоже в численном виде.
Тогда я возьми первый скрипт, и буду радоваться))
спасибо за помощь

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 17:59 16-08-2014
DrakonHaSh



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

Цитата:
date стоит тоже в численном виде.  

тогда будет работать так:
SELECT * FROM `server` ORDER BY if(`vip`=1, `date`, `vote`) DESC  
 

Цитата:
Тогда я возьми первый скрипт, и буду радоваться))
спасибо за помощь

пожалуйста. мне и самому было интересно

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 18:05 16-08-2014 | Исправлено: DrakonHaSh, 18:06 16-08-2014
IFKey



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть две связанные таблицы
 
Основная таблица

Цитата:
id_object | Объект
 

Таблица связка для "родителей"

Цитата:
id_object | id_patent

 
Надо выбрать все объекты которых нет в соседней таблице связке по полю id_object. Курю документацию, но не знаю с какой стороны к этом делу подъехать.

Всего записей: 331 | Зарегистр. 20-03-2007 | Отправлено: 12:56 28-08-2014
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Основная таблица - master
Таблица связка для "родителей" - submaster
 
запрос, который выберет записи из master у которых не прописан родитель в submaster

Код:
 
select master.id_object from master left join submaster on master.id_object=submaster.id_object where isnull(submaster.id_object)
 

 
Добавлено:
или так (более понятно, но менее производительно):

Код:
 
select id_object from master where id_object not in (select id_object from submaster)
 

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 13:27 28-08-2014
IFKey



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Работает. Благодарю!

Всего записей: 331 | Зарегистр. 20-03-2007 | Отправлено: 14:06 28-08-2014
bobuch



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток.
 
Пытаюсь вычленить из базы записи с временем от 11:00 до 12:00, но ответ выходит пустым:
 

Код:
 
$resultat = mysql_query("SELECT events_id, HOUR(events_t_start) AS chas,(
SELECT salons_name FROM salons WHERE salons_id = events_salon
) AS salon,  
events_theme, events_d_start, events_t_start, events_comments, (
SELECT users_name
FROM users
WHERE users_id = events_master
) AS master, (
SELECT clients_name
FROM clients
WHERE clients_id = events_client
) AS clients, events_status
FROM events WHERE events_d_start = '$data' AND chas == '11' ORDER BY chas, events_t_start;",$zapros);
 

 
Без условия  

Код:
 
WHERE chas == '11'
 

  запрос отрабатывает отлично. На этом затыке потерял пару дненй. Пробовал разные варианты кавычек и равенства/сравнения, разные условные опреаторы и  в итоге пришел к функции HOUR как к более локаничному решению.
 
Подскажите, пожалуйста, в какую сторону копать?
 
Заранее спасибо.

Всего записей: 2 | Зарегистр. 26-01-2010 | Отправлено: 14:49 11-09-2014
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bobuch
так, например, работает:
select comment_date, hour(comment_date) from wp_comments where hour(comment_date)=11
comment_date имеет тип datetime
 
так НЕ работает:
select comment_date, hour(comment_date) as xxx from wp_comments where xxx=11
а так уже работает:
select * from (select comment_date, hour(comment_date) as xxx from wp_comments)x where xxx=11
 
значения alias нельзя использовать в условиях:
 
Standard SQL doesn't allow you to refer to a column alias in a WHERE clause. This restriction is imposed because when the WHERE code is executed, the column value may not yet be determined.
 
http://dev.mysql.com/doc/refman/5.0/en/select.html
=>
It is not allowable to refer to a column alias in a WHERE clause, because the column value might not yet be determined when the WHERE clause is executed. See Section B.1.5.4, “Problems with Column Aliases”.

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 15:12 11-09-2014
bobuch



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

Всего записей: 2 | Зарегистр. 26-01-2010 | Отправлено: 15:22 11-09-2014
Sutar



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

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 16:01 12-09-2014 | Исправлено: Sutar, 19:20 12-09-2014
Sutar



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

Код:
"SELECT * FROM ((SELECT `ip` FROM `server` WHERE (`status` = '1' AND `ip` LIKE '$sear%') ORDER BY `ip` ASC) UNION (SELECT DISTINCT `map` FROM `server` WHERE (`status` = '1' AND `map` LIKE '$sear%') ORDER BY `map` ASC))x LIMIT 5"

 
вот составил запрос.
если искать по ip с 1 сортирует в виде:
 

Код:
 
10.123...
11.123...
12.123...
102.123...
103.123...
 

 
по возрастанию....
а если вести "d"
то результат будет без сортировки....
т.е.
 

Код:
 
de_dust2_2x2
de_dust2
de_dust2_2012
de_dust
de_dust2_...
 

 
как можно отсортировать более лучше?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 19:01 12-09-2014 | Исправлено: Sutar, 19:23 12-09-2014
DrakonHaSh



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

Цитата:
по возрастанию....
а если вести "d"
то результат будет без сортировки....  

это вы про результат из 2-го запроса после union или про что ?
если про него, то

Цитата:
в mysql order by работает с union только для первого подзапроса.

http://forum.ru-board.com/topic.cgi?forum=31&topic=13238&start=220#5
 
если про что-то другое, то переформулируйте.

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 20:38 12-09-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 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