SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.01.2011 23:55:28

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Помогите подкорректоровать запрос

мне когда то помог составить его paulus...

$result5 = mysql_query("SELECT u.*, m.* FROM users u JOIN (SELECT * FROM messages WHERE id_pol = '$id' AND id_otp = '$users' AND del_otp='0' OR id_otp = '$id' AND id_pol = '$users' AND del_pol='0' ORDER BY id DESC) m ON u.id = m.id_otp",$db);

запрос выводит переписку двух пользователей... в чем проблемма!? сообщения должны сортироваться при выводе по id таблицы messages... до шестого(!) сообщения выводится правильно, а потом они разделяються, сначала сообщения одного пользователя с сортировкой по id.messages, а потом сообщения другого пользователя...

я пробовал писать так (ORDER BY m.id DESC) не помагает smile
помогите разобраться

Неактивен

 

#2 01.02.2011 23:15:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

Ох уж этот paulus, вечно напридумает, а нам расхлебывать wink

Пример данных с id приведите, пожалуйста. Может, люди и правда писали
в таком порядке?

Неактивен

 

#3 03.02.2011 19:11:00

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

paulus, я не совсем понял. что нужно написать, структуру таблицы messages?

Неактивен

 

#4 03.02.2011 20:40:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

И данные. Запрос выглядит нормально, я думаю, что работает он правильно.

Неактивен

 

#5 03.02.2011 22:07:56

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

id     id_pol     id_otp     message     date_d     date_m     date_y     time     del_otp     del_pol     view
1003     217     215     5                   03     02     2011     20:54     0     0     1
1002     215     217     4                   03     02     2011     20:54     0     0     0
1001     217     215     3                   03     02     2011     20:54     0     0     0
1000     215     217     2                   03     02     2011     20:53     0     0     0
999     217     215     1                   03     02     2011     20:53     0     0     0

Вот допустим переписка между двумя пользователями (поочередно по одному сообщению) таблица messages

до 5-го сообщения выводилось поочередно:
lena234       4      (сегодня в 20:54)
serik           3      (сегодня в 20:53)
lena234       2      (сегодня в 20:53)
serik           1      (сегодня в 20:53)

после 5-го сообщения вот что:
lena234       4  (сегодня в 20:53)
lena234       2  (сегодня в 20:54)
serik           5  (сегодня в 20:54)
serik           3  (сегодня в 20:53)
serik           1  (сегодня в 20:53)
если удолить одно сообщение, выводится нормально... МИСТИКАsmile может на полную луну этот запрос не работает smile

Неактивен

 

#6 03.02.2011 23:25:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

А EXPLAIN у Вас, случаем, не меняется? Критично, чтобы первым исполнялся
подзапрос (иначе сортировка может сбиться). Если это не так — перепишите
в виде
SELECT STRAIGHT_JOIN ... FROM (..) m JOIN users u.

Неактивен

 

#7 05.02.2011 23:55:39

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

paulus написал:

А EXPLAIN у Вас, случаем, не меняется? Критично, чтобы первым исполнялся
подзапрос (иначе сортировка может сбиться). Если это не так — перепишите
в виде
SELECT STRAIGHT_JOIN ... FROM (..) m JOIN users u.

paulus, если можно рассшифруйте вышенаписанное, пожалуйстаsmile что такое EXPLAIN и как проверить меняется он или нет? и как именно переписать мой запрос, не могу разобраться что куда вставитьsad

Неактивен

 

#8 06.02.2011 14:21:43

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

EXPLAIN SELECT ... — пишет план выполнения запроса. То, как запрос будет выполняться.

Неактивен

 

#9 06.02.2011 15:36:09

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

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

Неактивен

 

#10 07.02.2011 04:28:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

эээ... Вы не можете дописать EXPLAIN перед запросом? Я допишу wink
EXPLAIN SELECT u.*, m.* FROM users u JOIN (SELECT * FROM messages WHERE id_pol = '$id' AND id_otp = '$users' AND del_otp='0' OR id_otp = '$id' AND id_pol = '$users' AND del_pol='0' ORDER BY id DESC) m ON u.id = m.id_otp

Неактивен

 

#11 07.02.2011 11:52:49

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

paulus, вы меня совсем запуталиsmile я EXPLAIN дописывал перед запросом... не работает вообще... вы писали выше что нужно переписать в виде (SELECT STRAIGHT_JOIN ... FROM (..) m JOIN users u.)... я за это спрашивал.

Неактивен

 

#12 07.02.2011 16:05:56

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

Ну, давайте я допишу STRAIGHT_JOIN и поменяю местами порядок таблиц smile

SELECT STRAIGHT JOIN u.*, m.* FROM (SELECT * FROM messages WHERE id_pol = '$id' AND id_otp = '$users' AND del_otp='0' OR id_otp = '$id' AND id_pol = '$users' AND del_pol='0' ORDER BY id DESC) m JOIN users u ON u.id = m.id_otp

Неактивен

 

#13 07.02.2011 19:37:48

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

этот запрос вообще не работает sad может в нем ошибка?

Неактивен

 

#14 08.02.2011 00:21:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

Может. Если бы Вы написали текст ошибки — мне было бы куда проще smile

Видимо, опечатался в записи STRAIGHT_JOIN (забыл подчеркивание).

Неактивен

 

#15 08.02.2011 00:38:00

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

да, теперь работает, но также как и предыдушийsad пусть я слабо разбираюсь в sql, но я одного не могу понять, запрос может сортировать или так или так, в зависимости от того как написан, но почему до 4-го сообщения сортирует так как надо, а потом по другому????????
paulus, помогите разобраться, в чем может быть ошибка?

Неактивен

 

#16 08.02.2011 02:49:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

Всё очень просто. У Вас выборка происходит из двух таблиц (одна являтся
подзапросом, но это сейчас не важно). Это значит, что нужно взять по одной
строке из одной таблицы, а потом находить соответствующую строку из другой.

Никакой сортировки при этом Вы не накладываете, т.е. если строки в первой
таблице расположены удачно, то и конечная выборка будет сортирована удачно.

Вот тут мы и вспоминаем, что одна из таблиц — подзапрос с сортировкой. Если
этот подзапрос будет «первой» таблицей, то выборка будет сортирована. Если
он будет «второй», то выборка будет сортирована «как-то». Вы наблюдаете
«как-то».

Неактивен

 

#17 09.02.2011 01:08:36

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

paulus, спасибо за развернутый ответ, хотя этот текст я мог бы написать в первом сообщении как вопросsmile то что в запросе что то не так, это и так ясно... если бы он работал правильно, я бы не просил помощи на форумеsmile paulus вы или теряете квалификацию или вас подменилиsmile

Неактивен

 

#18 09.02.2011 02:23:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

Ааа! Меня подменили! Что делать??!

На самом деле, я не писал, что в запросе что-то плохо. В нем почти всё хорошо.
Кроме того, что Вам критичен порядок таблиц, но он не фиксирован smile

Вот вам житейская аналогия. Вы — тренер Российской сборной по футболу. Слева
у Вас лежат футболки с номерами на спине. Отсортированные по возрастанию но-
мера. Справа — стоит толпа футболистов, которые не умеют сортироваться и стоят
гурьбой. Ваша задача — одеть на каждого футболиста футболку, соответствующую
его номеру, а потом быстро выпинать на поле.

У Вас есть два варианта:
1. Брать футболку с номером, а потом вызывать футболиста, чью фамилию Вы ви-
дите на футболке из толпы. После этого одетый футболист отправляется на поле.
Повторяем итерацию, пока не закончатся футболки.

2. Брать футболиста из толпы. Из стопки футболок выбирать ту, фамилия на которой
соответствует футболисту. После этого одетый футболист отправляется на поле.
Повторяем итерацию, пока не закончатся футболисты wink

Очевидно, что в первом случае футболисты выйдут на поле сортированные, а во
втором — нет. При том, что вы делаете одно и то же действие, просто выбираете
из таблиц в разном порядке.

Вот и в Вашем запросе — если выбрать сначала из подзапроса, а потом из второй
таблицы, то данные будут сортированы правильно. А если сначала из второй табли-
цы — то нет. Так понятнее объяснил? smile



И еще — проглядел весь тред, Вы так и не прислали результаты EXPLAIN с разными
наборами данных (особенно там, где ломается, интересно посмотреть).

Неактивен

 

#19 09.02.2011 23:09:12

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

познавательная аналогия, спасибоsmile
то что в запросе нужно таблицы местами поменять я уже давно понял, вот я вас и прошу что бы вы переписали запрос... для меня он сложный, я там не все понимаюsmile

paulus написал:

И еще — проглядел весь тред, Вы так и не прислали результаты EXPLAIN с разными
наборами данных (особенно там, где ломается, интересно посмотреть).

я бы прислал, если бы знал что нужно прислатьsmile

paulus написал:

эээ... Вы не можете дописать EXPLAIN перед запросом? Я допишу
EXPLAIN SELECT u.*, m.* FROM users u JOIN (SELECT * FROM messages WHERE id_pol = '$id' AND id_otp = '$users' AND del_otp='0' OR id_otp = '$id' AND id_pol = '$users' AND del_pol='0' ORDER BY id DESC) m ON u.id = m.id_otp

я дописывал EXPLAIN перед запросом он не работает вообще...

paulus написал:

EXPLAIN SELECT ... — пишет план выполнения запроса. То, как запрос будет выполняться.

теорию EXPLAIN я тоже примерно понял, а вот как возпользоваться этим EXPLAIN?

Неактивен

 

#20 10.02.2011 00:44:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

Ну, я не знаю, как написать подробнее, чем «добавьте EXPLAIN перед запросом».
Пример, может, поможет?

Код:

[silentia] root test > SELECT * FROM t;
+------+
| a    |
+------+
|    5 |
+------+
1 row in set (0.00 sec)

[silentia] root test > EXPLAIN SELECT * FROM t;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | t     | ALL  | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

Неактивен

 

#21 12.02.2011 20:51:44

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

Я тоже не знаю, как написать подробнее, что я уже пробовал добавлять EXPLAIN перед запросом, он в таком случае ничего не выводит... может я конечно что то не так делаю!?

$result5 = mysql_query("EXPLAIN SELECT u.*, m.* FROM users u JOIN (SELECT * FROM messages WHERE id_pol = '$id' AND id_otp = '$users' AND del_otp='0' OR id_otp = '$id' AND id_pol = '$users' AND del_pol='0' ORDER BY id DESC) m ON u.id = m.id_otp",$db);

Неактивен

 

#22 14.02.2011 00:57:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите подкорректоровать запрос

Да, Вы пытаетесь написать программу сразу. Не надо писать программу. Нужно
взять запрос и выполнить его в обычном клиенте. Например, mysql. Можете взять
клиент из MySQL GUI Tools.

Неактивен

 

#23 15.02.2011 01:27:12

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

мне нравится ваша методика помощи. "не дать человеку рыбу, а дать удочку и научить ловить рыбу..."
честно говоря, хотелось бы сразу рыбку съесть (сил уже нету) smile

я скачал и установил MySQL GUI Tools, но я не умею ею пользоваться и вообще пока не понимаю для чего это нужно и что нужно получить в конечном итоге... насколько я понял этот запрос нужно вводить и тестировать в окне MySql Query Browser!? я пытался написать "EXPLAIN SELECT u.*, m.* FROM users u JOIN (SELECT * FROM messages WHERE id_pol = '$id' AND id_otp = '$users' AND del_otp='0' OR id_otp = '$id' AND id_pol = $users AND del_pol='0' ORDER BY id DESC) m ON u.id = m.id_otp;" после нажатия на Execute выдает ошибку "Unknown column '$users' in 'where clause'"???

Неактивен

 

#24 15.02.2011 02:35:38

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Помогите подкорректоровать запрос

$id, $users это переменные PHP. Они чему-то равны, когда выполняется запрос. Вы можете в скрипте вывести запрос в том виде, в котором он сформирован с конкретными значениями переменных, а потом этот запрос ввести в Query Browser

Неактивен

 

#25 16.02.2011 00:09:46

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: Помогите подкорректоровать запрос

вокруг этой мысли крутился и недогадалсяsmile

я так сделал, экспортировал результаты, вот что получилось

id    select_type    table               type    possible_keys    key    key_len    ref    rows    Extra
1    PRIMARY    <derived2>    ALL                               6    (null)
1    PRIMARY    u               ALL    PRIMARY                5    Using where; Using join buffer
2    DERIVED    messages    ALL                               6    Using filesort

это поможет?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson