Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySQL запрос, опять не могу( 
V
    Опции темы
NNaarreekk
Дата 11.3.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Привет!
есть таблица
| id | ord |
| 1 | 122 |
| 2 | 15   |
| 5 | 69   |
| 9 | 111 |


Как можно из такой таблицы вызвать 2 строки так что первый тот  у которого мы знаем id а второй тот у которого ord меньше чем у первого но самая большая среди меньших?

На примере:
Если у нас есть id=9, то он должен взять id=9 и id=5 , потому что ord(id=5)<ord(id=9), но больше всех остальных у кого ord<ord(id=9)

А если скажете как просто у этих двоих сменить местами ord то +-a вам не избежать!
PM MAIL WWW   Вверх
Photon
Дата 11.3.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Злобный программер
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 27.2.2009
Где: Таганрог

Репутация: 10
Всего: 12



Код

select id from table_name where ord = (
  SELECT 
    max(t.ord)
  FROM
    table_name as t INNER JOIN
    table_name  ON
      table_name.ord > t.ord
  WHERE
    table_name.id = известный_id
)


Меняем table_name на имя нужной таблицы и радуемся жизни.. smile

Это сообщение отредактировал(а) Photon - 11.3.2009, 23:04


--------------------
With best regards..
PM MAIL ICQ Skype GTalk Jabber   Вверх
NNaarreekk
Дата 11.3.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Photon, спасибо!
То что надо!

А есть ли вариант со вторым вариантом?
Код

как просто у этих двоих сменить местами ord

PM MAIL WWW   Вверх
Photon
Дата 12.3.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Злобный программер
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 27.2.2009
Где: Таганрог

Репутация: 10
Всего: 12



На чистом MySQL - хз как сделать..
Если на PHP, тогда просто..

Код

$query = "
        SELECT id,ord FROM table_name WHERE ord = (
             SELECT 
                max(t.ord)
             FROM
                table_name as t INNER JOIN
                table_name  ON
                   table_name.ord > t.ord
             WHERE
                 table_name.id = известный_id
         )";
$res = mysql_query($query);
$vars = mysql_fetch_assoc($res);
$query = "UPDATE table_name SET ord = (SELECT ord FROM table_name WHERE id=известный_id) WHERE id = ".$vars['id'];
$query2 = "UPDATE table_name SET ord =  ".$vars['ord']." WHERE id = известный_id";
mysql_query($query);
mysql_query($query2);



--------------------
With best regards..
PM MAIL ICQ Skype GTalk Jabber   Вверх
NNaarreekk
Дата 12.3.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Photon, примерно так сделал и я!
Хотя не считаю что это самое оптимальное решение!

Еще раз спасибо!!
PM MAIL WWW   Вверх
Shark
Дата 12.3.2009, 20:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 18.6.2006
Где: Москва

Репутация: 4
Всего: 4



Photon, ну если разобрать твой код, то буду (должны быть) ошибки:
Код

$query = "
        SELECT id,ord FROM table_name WHERE ord = (
             SELECT 
                max(t.ord)
             FROM
                table_name as t INNER JOIN
                table_name  ON
                   table_name.ord > t.ord
             WHERE
                 table_name.id = известный_id
         )";
$res = mysql_query($query);
$vars = mysql_fetch_assoc($res);
$query = "UPDATE table_name SET ord = (SELECT ord FROM table_name WHERE id=известный_id) WHERE id = ".$vars['id'];
$query2 = "UPDATE table_name SET ord =  ".$vars['ord']." WHERE id = известный_id";
mysql_query($query);
mysql_query($query2);


1. Разберем первую часть:
Код

$query = mysql_query("
        SELECT id,ord FROM table_name WHERE ord = (
             SELECT 
                max(t.ord)
             FROM
                table_name as t INNER JOIN
                table_name  ON
                   table_name.ord > t.ord
             WHERE
                 table_name.id = известный_id
         )") or die (mysql_error());
$vars = mysql_fetch_assoc($query);

тут есть НО... 
а). скорее всего пользователю нужны будут и численные индексы в массиве, тогде лучше будет использовать функцию mysql_fetch_array() вместо mysql_fetch_assoc()
б). после каждого запроса лучше писать mysql_error() дабы выводились ошибки, которые могут появиться

2. Разберем вторую часть:
Код

$query = "UPDATE table_name SET ord = (SELECT ord FROM table_name WHERE id=известный_id) WHERE id = ".$vars['id'];
$query2 = "UPDATE table_name SET ord =  ".$vars['ord']." WHERE id = известный_id";
mysql_query($query);
mysql_query($query2);

Ошибки:
Код

$query = "UPDATE table_name SET ord = (SELECT ord FROM table_name WHERE id=известный_id) WHERE id = ".$vars['id']; // тут нет закрывающихся кавычек " и нет апострофов в выборке WHERE id = ".$vars['id']. 
эту часть надо писать так:
$query = "UPDATE table_name SET ord = (SELECT ord FROM table_name WHERE id=известный_id) WHERE id = '".$vars['id']."';  - поправте меня если я не прав

$query2 = "UPDATE table_name SET ord =  ".$vars['ord']." WHERE id = известный_id"; тут проблема с апострофами (ord =  ".$vars['ord']." - не правильно), надо так: ord =  '".$vars['ord']."'
эту часть надо писать так:
$query2 = "UPDATE table_name SET ord =  '".$vars['ord']."' WHERE id = 'известный_id'"; 

чтоб не писать личшнего, такого вида:
Код

mysql_query($query);
mysql_query($query2);

тогда вторая часть будет выглядеть так:
Код

$query1 = mysql_query("UPDATE table_name SET ord = (SELECT ord FROM table_name WHERE id=известный_id) WHERE id = '".$vars['id']."'") or die (mysql_error());
$query2 = mysql_query("UPDATE table_name SET ord =  '".$vars['ord']."' WHERE id = 'известный_id'") or die (mysql_error());


и никогда не пиши название одинаковую переменную в разных запросах, дабы избежать конфликтов...
пример:
Код

$query=mysql_query("SELECT * FROM tbl_a") or die (mysql_error());
$query=mysql_query("SELECT * FROM tbl_b") or die (mysql_error());


если я где-то ошибся или что-то пропустил, поправьте

Добавлено через 5 минут и 29 секунд
и еще:
Цитата

На чистом MySQL - хз как сделать..

MySQL является относительно небольшой и быстрой реляционной СУБД основанной на традициях Hughes Technologies Mini SQL (mSQL). 

то, что ты написал и есть работа с MySQL 



--------------------
Смерть - это только начало... 
Агентство недвижимости Premial
PM MAIL WWW ICQ   Вверх
NNaarreekk
Дата 13.3.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



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

Цитата(Shark @  12.3.2009,  22:39 Найти цитируемый пост)
 // тут нет закрывающихся кавычек "

Без кавычек тоже правильно работает, кроме некоторых исключений. И вообще почти везде кавычки пишутся для страховки хотя без них тоже все работает!


Цитата(Shark @  12.3.2009,  22:39 Найти цитируемый пост)
чтоб не писать личшнего, такого вида:
mysql_query($query);
mysql_query($query2);

А тут я стобой вообще не соглашусь. Писать запрос в отдельной переменной намного удобней чем прямо в запросе, потому-что дальнейшие манипуляции с запросом будут удобными.
Цитата(Shark @  12.3.2009,  22:39 Найти цитируемый пост)
Цитата

На чистом MySQL - хз как сделать..

MySQL является относительно небольшой и быстрой реляционной СУБД основанной на традициях Hughes Technologies Mini SQL (mSQL). 

то, что ты написал и есть работа с MySQL 


Под работой MySQL я имел ввиду только через mysql_query, Photon меня правильно понял!
PM MAIL WWW   Вверх
Photon
Дата 13.3.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Злобный программер
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 27.2.2009
Где: Таганрог

Репутация: 10
Всего: 12



Цитата(Shark @  12.3.2009,  20:39 Найти цитируемый пост)
 // тут нет закрывающихся кавычек " и нет апострофов
 
Их там нет, потому что они нахрен не нужны.. $vars['id'] - число..

Код
$query = "UPDATE table_name SET ord = (SELECT ord FROM table_name WHERE id=известный_id) WHERE id = '".$vars['id']."';

А это вообще вызовет ошибку, потому что нет одной кавычки в конце..


--------------------
With best regards..
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.