Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите построить запрос в MySQL, выборка из 3-х таблиц 
:(
    Опции темы
GoodBoy
Дата 3.9.2004, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



Цитата
Решение в составлении кореллированого подзапроса:


Код
lr.rid IN (SELECT region_ids FROM mail_region WHERE country_id = lr.pid AND phil_id = 5)


К сожалению в MySQL нет вложенных запросов... :-((((


Цитата(Ignat @ 3.9.2004, 10:29)
Блин, в мануале по мускулю написано, что IN ищет вхождение в ряд элементов, разделенных запятыми.

Именно!!!!!!!!!! и при всем этом хрен что получается....

Это сообщение отредактировал(а) GoodBoy - 3.9.2004, 10:26


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Ignat
Дата 3.9.2004, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(GoodBoy @ 3.9.2004, 11:24)
К сожалению в MySQL нет вложенных запросов... :-((((

С версии 4.1, которая сейчас гамма, уже есть.


--------------------
Теперь при чем :P
PM   Вверх
DENNN
Дата 3.9.2004, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



MySQL потдерживает вложенные запросы только в 5 бета версии.
Так что строка

Цитата
Код lr.rid IN (SELECT region_ids FROM mail_region WHERE country_id = lr.pid AND phil_id = 5)

не пройдет

PM ICQ   Вверх
Ignat
Дата 3.9.2004, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



DENNN
Цитата
Вложенные операции выборки реализованы в версии 4.1.

http://dev.mysql.com/doc/mysql/ru/ANSI_diff_Sub-selects.html



--------------------
Теперь при чем :P
PM   Вверх
GoodBoy
Дата 3.9.2004, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



Цитата(Ignat @ 3.9.2004, 11:37)
С версии 4.1, которая сейчас гамма, уже есть

Цитата(DENNN @ 3.9.2004, 11:38)
MySQL потдерживает вложенные запросы только в 5 бета версии

В любом случае, на том сервере, где это должно работать стоит 3.23 и изменить это нельзя!
Добавлено @ 10:47
Ignat
Вот именно!!!! Почитай ты ссылку, что ты дал!!!! там написано:
Цитата
В сервер MySQL поддерживает вложенные запросы вида INSERT ... SELECT ... и REPLACE ... SELECT ....

И далее:
Цитата
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);

можно переписать следующим образом:

SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;


SELECT * FROM table1 WHERE id IN (SELECT id FROM table2); - НЕ поддерживается!!!


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
<Spawn>
Дата 3.9.2004, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Дак все таки поясните 1,5,6,7,9,15,20,23,26,61 - это одна строка или множество строк?????? Если одна строка то оператор in будет сравнивать значение со всей строкой, а не с каждым элементом данной строки.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ignat
Дата 3.9.2004, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



<Spawn>, почему?
Это одна строка. В строке же мы имеем список...



--------------------
Теперь при чем :P
PM   Вверх
<Spawn>
Дата 3.9.2004, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Если делать на PHP и если это одна строка, то можно попробовать так:

Код
<?php
 ...
 $query = mysql_query("SELECT region_ids FROM mail_region WHERE country_id = 1 AND phil_id = 5", ...);
 $result = mysql_result($query, 0);
 $query2 = mysql_query("SELECT lr.*, lc.name as c_name
FROM mail_region as mr, list_country as lc, list_region as lr
WHERE mr.phil_id=5 AND mr.country_id=lr.pid AND lr.pid=lc.id AND lr.rid IN ($result)
ORDER BY lc.sort, lr.sort;", ...)
?>



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ignat
Дата 3.9.2004, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Это понятно... Тут головоломка: почему в один запрос не влезает...


--------------------
Теперь при чем :P
PM   Вверх
<Spawn>
Дата 3.9.2004, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Цитата(Ignat @ 3.9.2004, 02:58)
<Spawn>, почему?
Это одна строка. В строке же мы имеем список...

Потому что воспринимается это как строка, а не как множество. К примеру если я сделаю такой запрос:

Код
SELECT * FROM Table WHERE 'asd' in ('asdasdasdasdasdadsdsa')


то это же не будет занчить что сравнение будет вестись с каждой тройкой символов, так как это строка.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Secandr
Дата 3.9.2004, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



Для разбора такой строки используйте LOCATE


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
GoodBoy
Дата 3.9.2004, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



Цитата
Дак все таки поясните 1,5,6,7,9,15,20,23,26,61 - это одна строка или множество строк??????

одна

Цитата
Если делать на PHP и если это одна строка, то можно попробовать так:

Не-е!!!! так я и на Перле могу сделать!!! смысл в том, что-бы сделать все одним запросом не прибегая к языку!!!


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Ignat
Дата 3.9.2004, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(GoodBoy @ 3.9.2004, 11:45)
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2); - НЕ поддерживается!!!


Сейчас только на 4.1 выполнил для проверки:
SELECT descr FROM sec_temp WHERE id=(SELECT sec_id FROM temp WHERE id=1);

Всё работает.

Добавлено @ 11:22
Secandr, это мысль!


--------------------
Теперь при чем :P
PM   Вверх
GoodBoy
Дата 3.9.2004, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



Черт, что за ересь!!!!

Имеем запросы:
Код
SELECT lr.*, lc.name as c_name
FROM mail_region as mr, list_country as lc, list_region as lr
WHERE mr.phil_id=5 AND mr.country_id=lr.pid AND lr.pid=lc.id
AND lr.rid in (CONCAT("'", REPLACE(mr.region_ids, ",", "','") ,"'"))
ORDER BY lc.sort, lr.sort;

Который для нашего случая в сущности эквивалентен:
Код
SELECT lr.*, lc.name as c_name
FROM mail_region as mr, list_country as lc, list_region as lr
WHERE mr.phil_id=5 AND mr.country_id=lr.pid AND lr.pid=lc.id
AND lr.rid in ('1','5','6','7','9','15','20','23','26','61')
ORDER BY lc.sort, lr.sort;

В первом случае:
Код
Empty set (0.00 sec)

А во втором:
Код
+----+-----+-----+---------------------------------+----------------+------+--------+
| id | pid | rid | name                                                       | capital                | sort | c_name |
+----+-----+-----+---------------------------------+----------------+------+--------+
|  3   |   1   |   1   | Республика Адыгея                             | Майкоп                 |    3     | Россия |
|  7   |   1   |   5   | Республика Дагестан                          | Махачкала            |    7     | Россия |
|  8   |   1   |   6   | Республика Ингушетия                       | Назрань                |    8     | Россия |
|  9   |   1   |   7   | Кабардино-Балкарская Республика | Нальчик               |    9     | Россия |
| 11 |   1   |   9   | Карачаево-Черкесская Республика | Черкесск             |   11   | Россия |
| 17 |   1   |  15   | Республика Северная Осетия           | Владикавказ        |   17   | Россия |
| 22 |   1   |  20   | Чеченская Республика                        | Грозный                |   22   | Россия |
| 25 |   1   |  23   | Краснодарский край                            | Краснодар            |   25   | Россия |
| 28 |   1   |  26   | Ставропольский край                         | Ставрополь         |   28   | Россия |
| 63 |   1   |  61   | Ростовская область                            | Ростов-на-Дону |   63   | Россия |
+----+-----+-----+---------------------------------+----------------+------+--------+

Т.е. именно то, что и нужно!!!!!!

Это сообщение отредактировал(а) GoodBoy - 3.9.2004, 11:26


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Ignat
Дата 3.9.2004, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



GoodBoy, попробуй действительно как сказал Secandr

Добавлено @ 11:31
Код
SELECT lr.*, lc.name as c_name
FROM mail_region as mr, list_country as lc, list_region as lr
WHERE mr.phil_id=5 AND mr.country_id=lr.pid AND lr.pid=lc.id AND LOCATE(lr.rid, mr.region_ids)
ORDER BY lc.sort, lr.sort;

Вроде так...


--------------------
Теперь при чем :P
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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