Задавайте вопросы, мы ответим
Вы не зашли.
мне когда то помог составить его 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) не помагает
помогите разобраться
Неактивен
Ох уж этот paulus, вечно напридумает, а нам расхлебывать
Пример данных с id приведите, пожалуйста. Может, люди и правда писали
в таком порядке?
Неактивен
paulus, я не совсем понял. что нужно написать, структуру таблицы messages?
Неактивен
И данные. Запрос выглядит нормально, я думаю, что работает он правильно.
Неактивен
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)
если удолить одно сообщение, выводится нормально... МИСТИКА может на полную луну этот запрос не работает
Неактивен
А EXPLAIN у Вас, случаем, не меняется? Критично, чтобы первым исполнялся
подзапрос (иначе сортировка может сбиться). Если это не так — перепишите
в виде
SELECT STRAIGHT_JOIN ... FROM (..) m JOIN users u.
Неактивен
paulus написал:
А EXPLAIN у Вас, случаем, не меняется? Критично, чтобы первым исполнялся
подзапрос (иначе сортировка может сбиться). Если это не так — перепишите
в виде
SELECT STRAIGHT_JOIN ... FROM (..) m JOIN users u.
paulus, если можно рассшифруйте вышенаписанное, пожалуйста что такое EXPLAIN и как проверить меняется он или нет? и как именно переписать мой запрос, не могу разобраться что куда вставить
Неактивен
EXPLAIN SELECT ... — пишет план выполнения запроса. То, как запрос будет выполняться.
Неактивен
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
Неактивен
paulus, вы меня совсем запутали я EXPLAIN дописывал перед запросом... не работает вообще... вы писали выше что нужно переписать в виде (SELECT STRAIGHT_JOIN ... FROM (..) m JOIN users u.)... я за это спрашивал.
Неактивен
Ну, давайте я допишу STRAIGHT_JOIN и поменяю местами порядок таблиц
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
Неактивен
этот запрос вообще не работает может в нем ошибка?
Неактивен
Может. Если бы Вы написали текст ошибки — мне было бы куда проще
Видимо, опечатался в записи STRAIGHT_JOIN (забыл подчеркивание).
Неактивен
да, теперь работает, но также как и предыдуший пусть я слабо разбираюсь в sql, но я одного не могу понять, запрос может сортировать или так или так, в зависимости от того как написан, но почему до 4-го сообщения сортирует так как надо, а потом по другому????????
paulus, помогите разобраться, в чем может быть ошибка?
Неактивен
Всё очень просто. У Вас выборка происходит из двух таблиц (одна являтся
подзапросом, но это сейчас не важно). Это значит, что нужно взять по одной
строке из одной таблицы, а потом находить соответствующую строку из другой.
Никакой сортировки при этом Вы не накладываете, т.е. если строки в первой
таблице расположены удачно, то и конечная выборка будет сортирована удачно.
Вот тут мы и вспоминаем, что одна из таблиц — подзапрос с сортировкой. Если
этот подзапрос будет «первой» таблицей, то выборка будет сортирована. Если
он будет «второй», то выборка будет сортирована «как-то». Вы наблюдаете
«как-то».
Неактивен
paulus, спасибо за развернутый ответ, хотя этот текст я мог бы написать в первом сообщении как вопрос то что в запросе что то не так, это и так ясно... если бы он работал правильно, я бы не просил помощи на форуме paulus вы или теряете квалификацию или вас подменили
Неактивен
Ааа! Меня подменили! Что делать??!
На самом деле, я не писал, что в запросе что-то плохо. В нем почти всё хорошо.
Кроме того, что Вам критичен порядок таблиц, но он не фиксирован
Вот вам житейская аналогия. Вы — тренер Российской сборной по футболу. Слева
у Вас лежат футболки с номерами на спине. Отсортированные по возрастанию но-
мера. Справа — стоит толпа футболистов, которые не умеют сортироваться и стоят
гурьбой. Ваша задача — одеть на каждого футболиста футболку, соответствующую
его номеру, а потом быстро выпинать на поле.
У Вас есть два варианта:
1. Брать футболку с номером, а потом вызывать футболиста, чью фамилию Вы ви-
дите на футболке из толпы. После этого одетый футболист отправляется на поле.
Повторяем итерацию, пока не закончатся футболки.
2. Брать футболиста из толпы. Из стопки футболок выбирать ту, фамилия на которой
соответствует футболисту. После этого одетый футболист отправляется на поле.
Повторяем итерацию, пока не закончатся футболисты
Очевидно, что в первом случае футболисты выйдут на поле сортированные, а во
втором — нет. При том, что вы делаете одно и то же действие, просто выбираете
из таблиц в разном порядке.
Вот и в Вашем запросе — если выбрать сначала из подзапроса, а потом из второй
таблицы, то данные будут сортированы правильно. А если сначала из второй табли-
цы — то нет. Так понятнее объяснил?
И еще — проглядел весь тред, Вы так и не прислали результаты EXPLAIN с разными
наборами данных (особенно там, где ломается, интересно посмотреть).
Неактивен
познавательная аналогия, спасибо
то что в запросе нужно таблицы местами поменять я уже давно понял, вот я вас и прошу что бы вы переписали запрос... для меня он сложный, я там не все понимаю
paulus написал:
И еще — проглядел весь тред, Вы так и не прислали результаты EXPLAIN с разными
наборами данных (особенно там, где ломается, интересно посмотреть).
я бы прислал, если бы знал что нужно прислать
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?
Неактивен
Ну, я не знаю, как написать подробнее, чем «добавьте 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)
Неактивен
Я тоже не знаю, как написать подробнее, что я уже пробовал добавлять 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);
Неактивен
Да, Вы пытаетесь написать программу сразу. Не надо писать программу. Нужно
взять запрос и выполнить его в обычном клиенте. Например, mysql. Можете взять
клиент из MySQL GUI Tools.
Неактивен
мне нравится ваша методика помощи. "не дать человеку рыбу, а дать удочку и научить ловить рыбу..."
честно говоря, хотелось бы сразу рыбку съесть (сил уже нету)
я скачал и установил 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'"???
Неактивен
$id, $users это переменные PHP. Они чему-то равны, когда выполняется запрос. Вы можете в скрипте вывести запрос в том виде, в котором он сформирован с конкретными значениями переменных, а потом этот запрос ввести в Query Browser
Неактивен
вокруг этой мысли крутился и недогадался
я так сделал, экспортировал результаты, вот что получилось
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
это поможет?
Неактивен