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

Поиск:

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


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


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

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



Что-то я уже по-моему просто тупить начинаю... :-((((

Есть 3 таблицы:
Код
mail_region
-------------------------
phil_id         int(4) unsigned
country_id   int(4) unsigned
region_ids   varchar(255)

list_country
-------------------------
id       int(3) unsigned
name   varchar(100)
sort   int(3) unsigned

list_region
-------------------------
id             int(4) unsigned
pid           int(3) unsigned
rid           int(3) unsigned
name         varchar(100)
capital   varchar(100)
sort         int(4) unsigned


есть данные в них:

Код
select * from mail_region;
+---------+------------+--------------------------+
| phil_id | country_id | region_ids                              |
+---------+------------+--------------------------+
|       6       |          1           | 12,21                                       |
|       7       |          1           | 45,74                                        |
|       5       |          1           | 1,5,6,7,9,15,20,23,26,61 |
|       3       |          1           | 3,16,18,73                             |
|       4       |          1           | 43,52                                        |
|       2       |          1           | 66,72                                        |
|       1       |          1           | 77,50                                       |
+---------+------------+--------------------------+


select * from list_country;
+----+-----------+------+
| id | name            | sort |
+----+-----------+------+
|  1 | Россия         |    1     |
|  2 | Беларусь      |    2     |
|  3 | Казахстан   |    3     |
|  4 | Украина       |    4     |
|  5 | Экс-СССР      |    5     |
|  6 | Прочие          |    6     |
+----+-----------+------+


select * from list_region;
+-----+-----+-----+----------------------------+-----------------+------+
|   id  | pid | rid | name                                             | capital                 | sort |
+-----+-----+-----+----------------------------+-----------------+------+
|   1    |   1   |  77   | Москва                                          | Москва                   |    1     |
|   2    |   1   |  78   | Санкт-Петербург                        | Санкт-Петербург |    2     |
|   3    |   1   |   1   | Республика Адыгея                   | Майкоп                   |    3     |
|   4    |   1   |   2   | Республика Алтай                      | Барнаул                  |    4     |
...
|  78   |   1   |  76   | Ярославская область               | Ярославль             |   78   |
|  79   |   2   |   1   | Брестская область                    | Брест                      |    1     |
|  80   |   2   |   2   | Витебская область                    | Витебск                  |    2     |
...
|  84   |   2   |   6   | Могилевская область               | Могилев                 |    6     |
|  85   |   3   |   1   | Астана                                         | Астана                   |    1     |
|  86   |   3   |   2   | Алма-Ата                                     | Алма-Ата               |    2     |
...
| 100 |   3   |  16   | Южно-Казахстанская область | Шымкент                  |   16   |
| 101 |   4   |   1   | Винницкая область                   | Винница                 |    1     |
| 102 |   4   |   2   | Волынская область                    | Волынск                 |    2     |
...
| 125 |   4   |  25   | Черновецкая область               | Черновцы               |   25   |
| 126 |   5   |   1   | Азербайджан                               | Баку                       |    1     |
| 127 |   5   |   2   | Армения                                        | Ереван                    |    2     |
...
| 136 |   5   |  11   | Эстония                                        | Таллин                   |   11   |
+-----+-----+-----+----------------------------+-----------------+------+




Мне нужно сделать выборку для какого-то региона, к примеру 5. Выбрать нужно названия всех областей. Пишу запрос:
Код
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 (mr.region_ids)
ORDER BY lc.sort, lr.sort;


и вместо ожидаемых 6 строк получаю одну:
Код
+----+-----+-----+-------------------+---------+------+--------+
| id | pid | rid | name                           | capital | sort | c_name |
+----+-----+-----+-------------------+---------+------+--------+
|  3   |   1   |   1   | Республика Адыгея | Майкоп    |     3    | Россия |
+----+-----+-----+-------------------+---------+------+--------+


Где косяк??????????


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

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


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


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

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



А откуда должно быть 6??? Если предикатам удовлетворяет одна строка?


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


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


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

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



т. е. не 6 а 10:

Код
|    5    |     1      | 1,5,6,7,9,15,20,23,26,61 |



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

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


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


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

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



Код
lr.rid IN (mr.region_ids)

Код
mr.phil_id=5


Посмотри на эти строки и поймешь...
Добавлено @ 17:04
Ну тык он выбирает из lr только где pid=1


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


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


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

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



Ignat
Уже ничего не понимаю... Башка к вечеру квадратная... Можешь подправить запрос???


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

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


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


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

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



lr.pid=lc.id
Попробуй заменить на mr.country_id=lc.id

Добавлено @ 17:26
Цитата(GoodBoy @ 2.9.2004, 18:05)
Башка к вечеру квадратная...

Аналогично smile.gif



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


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


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

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



неа... те же яйца...

ХЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЛП!!!!!!!!!!!!!!!!!!!!!!!!! :-(((((((((((((((


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

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


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


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

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



Что-то я тооооормооожу.


Код
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 mr.country_id=lc.id AND (lr.rid IN (mr.region_ids))
ORDER BY lc.sort, lr.sort;

Для проверки можно временно выкинуть:
lr.rid IN (mr.region_ids)


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


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


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

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



неа, не работает... А если выкинуть это: lr.rid IN (mr.region_ids), то выгребаются все 78 записей, относящихся к России...


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

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


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


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

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



Дебилизм.... лыжи не едут...
Такой вариант на авось: в mr.region_ids после запятых поставь по пробелу.

ЗЫ Прошу прощения, сразу не воткнул в трабл (в таблице многоточия не рассмотрел withstupid.gif ).


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


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


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

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



Цитата(Ignat @ 2.9.2004, 19:01)
Такой вариант на авось: в mr.region_ids после запятых поставь по пробелу

:-)))))))))))))))))))))) не-е!!!!!!!!!!! ниче не изменится!!!!!!!!!!! :-))))))))))


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

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


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


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

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



Запись
Код
lr.rid IN (mr.region_ids)

Аналогична
Код
lr.rid = mr.region_ids

Так что ни чего удивительного.

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

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


P.S. Сейчас только обратил внимание на 1,5,6,7,9,15,20,23,26,61. Это одна строка или нет? Если это строка, то нужно искать возможность получения из нее множества этих чисел встроеными функциями, если такое в MySQL возможно вообще, либо в среде программирования сначала извлечь данную строку и явно вписав в in (...). smile.gif

Это сообщение отредактировал(а) <Spawn> - 2.9.2004, 22:31


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


Связист
****


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

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



для парсинга 1,5,6,7,9,15,20,23,26,61
может помочь оператор LOCATE - позиция подстроки в строке
Добавлено @ 08:35
Хотя ИМХО, это неверно спроектированная бд.


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


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


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

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



Secandr Ага, прослеживается отсутствие атомарности в некоторых местахsmile.gif

Это сообщение отредактировал(а) <Spawn> - 3.9.2004, 08:49


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


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


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

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



Блин, в мануале по мускулю написано, что IN ищет вхождение в ряд элементов, разделенных запятыми.
Добавлено @ 09:33
http://dev.mysql.com/doc/mysql/ru/Comparis...rs.html#IDX1122


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


 




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


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

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