Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Одновременный запрос с нескольких таблиц
 
 автор: FiX   (26.06.2006 в 20:20)   письмо автору
 
 

Как делать запросы с нескольких таблиц?
Например, есть две таблицы: main и add, у них есть поля, one и two соответственно. Как одним запросом "спросить" эти данные?

   
 
 автор: Саня   (27.06.2006 в 01:19)   письмо автору
 
   для: FiX   (26.06.2006 в 20:20)
 

При многотабличных запросах нужно уточнять, из какой таблицы идёт выборка:
SELECT main.one, add.two FROM main, add;

   
 
 автор: FiX   (27.06.2006 в 12:26)   письмо автору
 
   для: Саня   (27.06.2006 в 01:19)
 

А можно подробее о всех элементах:
SELECT main.one, add.two FROM main, add;
main.one - это столбец one из таблица main, так? Второй тоже... А можно ли сделать такой же запрос, но для трех, четырех таблиц? Например, SELECT main.one, add,two, three,three и т.д.?
И еще: как вытащить результат? mysql_fetch_array() подойдет?

   
 
 автор: valenok   (27.06.2006 в 12:27)   письмо автору
 
   для: FiX   (27.06.2006 в 12:26)
 

таблица.поле

   
 
 автор: cheops   (27.06.2006 в 15:14)   письмо автору
 
   для: FiX   (27.06.2006 в 12:26)
 

>тоже... А можно ли сделать такой же запрос, но для трех,
>четырех таблиц? Например, SELECT main.one, add,two,
>three,three и т.д.?
Да, можно, только лучше не злоупотреблять, так как при многотабличных запросах достаточно серьёзная нагрузка на базу данных.

>И еще: как вытащить результат? mysql_fetch_array() подойдет?
Да подойдёт, только вместо ключа нужно писать расширенное имя, как указал valenok, или использовать псевдонимы столбцов, которые можно назначить при помощи оператора AS
SELECT main.one AS one, add.two AS two FROM main, add;

   
 
 автор: FiX   (29.06.2006 в 01:14)   письмо автору
 
   для: cheops   (27.06.2006 в 15:14)
 

А как сделать вот такую вещь. Нужно выбрать все столбцы из первой таблицы, а из второй - только один. Не получилось...
Идея вот какая. В первой таблице в поле street хранится id улицы со второй таблицы. То есть:

streets  // первая таблица, с id улицы
    1
    2

id | name  // вторая таблица, с названием улицы
 1 | победы
 2 | мира

Надеюсь, объяснил понятно... Первая таблица называется main вторая - streets.

   
 
 автор: cheops   (29.06.2006 в 02:05)   письмо автору
 
   для: FiX   (29.06.2006 в 01:14)
 

Для этого следует воспользоваться запросом вида
SELECT main.*, street.name AS two 
FROM streets, main
WHERE main.id_street = streets.id
GROUP BY main.id;

   
 
 автор: FiX   (29.06.2006 в 23:01)   письмо автору
 
   для: cheops   (29.06.2006 в 02:05)
 

Спасибо, работает! Но вот следующая проблема:
Никак не получается сделать запрос. Есть три улицы: street_1, street_2, street_3. Названия берутся из той же таблицы (streets). Как вытащить эти названия для трех столбов? Запрос вида

SELECT buy.*, streets.name AS streets FROM streets, buy WHERE buy.street_1 && buy.street_2 && buy.street_3 = streets.id GROUP BY buy.id

выводит только последнее название улицы... Помогите, пожалуйста.

   
 
 автор: cheops   (30.06.2006 в 11:46)   письмо автору
 
   для: FiX   (29.06.2006 в 23:01)
 

Чего-то не очень понятно... Как звучит условие выборки на словах?

   
 
 автор: FiX   (30.06.2006 в 17:42)   письмо автору
 
   для: cheops   (30.06.2006 в 11:46)
 

Как мы уже говорили, названия улиц хранятся в таблице streets. Так вот, а в другой таблице (buy) вместо названия улиц стоят просто их id (например, у улицы Мира id - 2, и т.д.). Думаю, это понятно. Во второй таблице полей с "улицами" три. У каждого из полей разные улицы, например (id): 2, 8, 6. Для этих трех мне и надо вытащить названия улиц. Как я уже писал, подобный запрос выводит только последнюю улицу, то есть, например, 6.
Думаю, понятно... :)

   
 
 автор: cheops   (30.06.2006 в 18:46)   письмо автору
 
   для: FiX   (30.06.2006 в 17:42)
 

У вас MySQL выше версии 4.1 или ниже? Т.е. имеется возможность использовать вложенные запросы?

   
 
 автор: FiX   (02.07.2006 в 12:45)   письмо автору
 
   для: cheops   (30.06.2006 в 18:46)
 

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

   
 
 автор: Trianon   (30.06.2006 в 18:52)   письмо автору
 
   для: FiX   (29.06.2006 в 23:01)
 

А так?

SELECT buy.*, s1,name, s2.name, s3.name 
FROM buy, streets as s1, streets as s2, streets as s3
WHERE buy.street_1 = s1.id AND buy.street_2 = s1.id AND buy.street_3 = s3.id

   
 
 автор: FiX   (01.07.2006 в 18:20)   письмо автору
 
   для: Trianon   (30.06.2006 в 18:52)
 

И так не получается :( По разному пробовал менять данные, менял названия столбцов, бесполезно. Сколько часов сидел, все напрасно. Попробую объяснить на пальцах :)

Таблица buy:
улица : id улицы (с таблицы streets)
street_1 : 2
street_2 : 1
street_3 : 3

Таблица streets:
id : название (name)
1 : Мира
2 : Строителей
3 : Советская

То есть, street_1 должна выводить название улицы - Строителей, street_2 - Мира, street_3 - Советская. Я бы использовал вложенный запрос (с использованием while - по три запроса на цикл), но он очень "сложный" для сервера mysql, тем более, если будет таких запросов от 100 и выше...

   
 
 автор: FiX   (03.07.2006 в 00:55)   письмо автору
 
   для: FiX   (01.07.2006 в 18:20)
 

Ну пожалуйста, ведь для кого-то этот запрос очень легкий =)

   
 
 автор: Trianon   (03.07.2006 в 20:46)   письмо автору
 
   для: FiX   (03.07.2006 в 00:55)
 

У меня вариант (30.06.2006 в 18:52) идет на ура. Если исправить опечатку, заменив в s1,name запятую на точку.
Что у Вас за версия сервера? Сдается мне, она настолько древняя, что вложенные запросы не поддерживает, раз такой простой не смогла взять.

   
 
 автор: FiX   (03.07.2006 в 23:10)   письмо автору
 
   для: Trianon   (03.07.2006 в 20:46)
 

Не знаю, у меня не идет... Версия у меня 4.1.
Может, я поля неправильно менял? Пробовал и с s1.name, пробовал и street_1.name, и street_1.buy, ничего... А вообще, такая же схема, как и в тех запросах (выше), но надо одновременно спросить данные для трех таблиц.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования