SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 27.05.2014 00:07:26

Kiraja
Участник
Зарегистрирован: 15.02.2014
Сообщений: 6

Помогите составить запрос с выборкой из нескольких таблиц

Здравствуйте, пожалуйста помогите составить сложный запрос.
У меня есть 3 таблицы (квартиры, дома, гаражи) с объявлениями и содержат похожие данные за исключением некоторых полей:

kvartiry
id
title
price
num_rooms

doma
id
title
price
s_uchastka

garazhi
id
title
price
num_cars

И еще есть общая таблица, содержащая идентификаторы всех объявлений и дату создания:

all_adds
id
created

Нужно выбрать из первых трех таблиц 5 самых свежих объявлений отображая поля id, title, price
Не пойму как связать первые 3 таблицы, если их id-шники не пересекаются. Буду очень благодарна за совет, как составить такой запрос. И если таких таблиц как первые будет не 3 а, больше 20?

Неактивен

 

#2 27.05.2014 15:28:13

WowaNik
Завсегдатай
Зарегистрирован: 26.03.2014
Сообщений: 31

Re: Помогите составить запрос с выборкой из нескольких таблиц

Можно через Union попробовать.
Если больше 20 - долго будет выполняться.
Можно выполнить несколько запросов и объединять данные уже на клиенте.

Отредактированно WowaNik (27.05.2014 15:29:41)

Неактивен

 

#3 27.05.2014 16:35:48

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5829

Re: Помогите составить запрос с выборкой из нескольких таблиц

Одним запросом:

select t2.* from
(select id, created from all_adds order by 2 desc limit 5) t1 join
(select id, title, price from kvartiry union all
select id, title, price from doma union all
select id, title, price from garazhi) t2 using(id);
 

Но лучше разбить на несколько, сначала из all_adds выбираете нужные id, затем из первых по id выбираете объявления.
Или пересмотреть структуру, включив в all_adds общие поля (title, price)

Неактивен

 

#4 27.05.2014 16:53:34

Kiraja
Участник
Зарегистрирован: 15.02.2014
Сообщений: 6

Re: Помогите составить запрос с выборкой из нескольких таблиц

Спасибо vasya, второй раз выручаете smile
Насколько быстро будет работать такой зспрос с union, если таблицы будут содержать порядки миллиона строк? Получается что все таблицы объединяются в 1 временную и из нее идет выборка?

Есть костыльно-ориентированный рабочий вариант такой (если добавить в последнюю таблицу поле table_name, содержащее имя таблицы где находится объявление с данным id):

//выбираем id, table_name из общей таблицы
$query = "select id, table_name
        from all_adds
        order by created desc
        limit 5"
;

$result = $conn->query($query);

if ($result->num_rows)
{
    //а затем цыклом делаем еще 5 запросов на поиск строк с выбранными объявлениями из конкретных таблиц
    while ($r = $result->fetch_assoc()) {
        $query = "select id, title, price
                from {$r['table_name']}
                where id = {$r['id']}"
;
        $result2 = $conn->query($query);
        if ($result2->num_rows)
        {
            while ($r2 = $result2->fetch_assoc()) {
                echo $r2['id']." ".$r2['title']." цена ".$r2['price'].'<br>';
            }
        }
    }
}


Но ваш вариант быстрее. Спасибо, что уделили время smile

Отредактированно Kiraja (27.05.2014 17:16:27)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson