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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> составление сложного запроса, как получить сводную таблицу 
:(
    Опции темы
vitamax
Дата 24.5.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Гуру SQL, помогите!

Имеется следующая таблица:
user posted image

на выходе должна быть следующая таблица
user posted image

Пояснения:
Исходная таблица содержит в себе переводы нескольких полей из другой таблицы, а так же сами ориганильные значения этих полей (для удобства).
Переводимые поля: title, home_summary, interior_exterior_design, local_area_and_activities.
В исходной таблице:
id - счетчик auto_increment
id_advert - id материала
lang - язык. Где: 0 - оригинальные значения полей. 1 -RU, 2 - EN, 3 - ES
title, home_summary, interior_exterior_design, local_area_and_activities - текстовые поля для перевода
published - ключ, показывающий опубликован ли перевод или нет.

В сводной таблице нужно отобразить id_advert, title оригинала, published для русского перевода, published для анг пеервода, published для ES

title оригинала - это значение поля title, где поле lang == 0.

Чтобы было визуально понятно, вот представление того, где эта сводная таблица будет использована
user posted image

Так вот вопрос в тм, как получить эту сводную таблицу? ограничения на кол-во запросов нет.

PM MAIL   Вверх
triclosan
Дата 24.5.2011, 15:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

select i.id_advert, i.title, 
sum(IF(t.lang=1,t.published,0)) AS ru,
sum(IF(t.lang=2,t.published,0)) AS eng,
sum(IF(t.lang=3,t.published,0)) AS esp
from ishtable t,  
(select *
from ishtable
where lang = 0
) i
where i.id_advert=t.id_advert
group by i.id_advert, i.title

PM MAIL   Вверх
vitamax
Дата 24.5.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо огромное!
PM MAIL   Вверх
vitamax
Дата 26.5.2011, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А как изменить этот запрос, чтобы вывелись только строки, в которых есть хотя бы одно поле published, не равное единице?

И с другой стороны, как изменить этот запрос, чтобы вывелись только строки, в которых все поля published равны единице?
PM MAIL   Вверх
triclosan
Дата 26.5.2011, 18:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vitamax @  26.5.2011,  14:08 Найти цитируемый пост)
есть хотя бы одно поле published

Код

select * from  
(select i.id_advert, i.title, 
sum(IF(t.lang=1,t.published,0)) AS ru,
sum(IF(t.lang=2,t.published,0)) AS eng,
sum(IF(t.lang=3,t.published,0)) AS esp
from ishtable t,  
(select *
from ishtable
where lang = 0
) i
where i.id_advert=t.id_advert
group by i.id_advert, i.title) t1
where t1.ru+t1.eng+t1.esp>0



Цитата(vitamax @  26.5.2011,  14:08 Найти цитируемый пост)
в которых все поля published равны единице

Код

select * from  
(select i.id_advert, i.title, 
sum(IF(t.lang=1,t.published,0)) AS ru,
sum(IF(t.lang=2,t.published,0)) AS eng,
sum(IF(t.lang=3,t.published,0)) AS esp
from ishtable t,  
(select *
from ishtable
where lang = 0
) i
where i.id_advert=t.id_advert
group by i.id_advert, i.title) t1
where t1.ru+t1.eng+t1.esp=3


Это сообщение отредактировал(а) triclosan - 26.5.2011, 18:08
PM MAIL   Вверх
vitamax
Дата 26.5.2011, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо, triclosan!
PM MAIL   Вверх
vitamax
Дата 6.6.2011, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

есть следующий запрос:
Код

SELECT                        wh_advert_ess_info.id as adv_id, 
                            wh_advert_ess_info.num_of_guests AS People, 
                            wh_advert_ess_info.property_type, 
                            wh_region_spain.arg_region_name, 
                            wh_town_spain.name AS TownName, 
                            wh_advert.title,
                            jos_datsogallery.imgfilename, 
                            MIN( wh_advert_rental_rates.weekly_rate ) AS LowestOrderPrice, 
                            MAX( wh_advert_rental_rates.weekly_rate ) AS LargestOrderPrice
                            
FROM                        wh_advert_ess_info,
                            wh_advert, 
                            jos_datsogallery, 
                            wh_advert_rental_rates,
                            wh_region_spain,
                            wh_town_spain,
                            wh_advert_area_details,
                            wh_advert_eq_and_fac,
                            bookings
            
                            
WHERE                        wh_advert.activate=1 
                            AND
                            wh_region_spain.id = wh_advert_ess_info.region 
                            AND
                            wh_town_spain.id = wh_advert_ess_info.town 
                            AND
                            wh_advert_ess_info.id = wh_advert.id    
                            AND
                            wh_advert_eq_and_fac.id = wh_advert.id    
                            AND
                            wh_advert_area_details.id = wh_advert.id                            
                            AND
                            jos_datsogallery.advert_id = wh_advert.id AND jos_datsogallery.approved=1 
                            AND 
                            wh_advert_rental_rates.id = wh_advert.id   

GROUP BY wh_advert_rental_rates.id, wh_advert.id 

                            


есть таблица wh_special_offer:
id   -  auto_increment 
id_advert
type - tinyint(1)

Вопрос - как в этот запрос (в результирующую таблицу) добавить дополнительное поле _count, значение для которого берется из таблицы wh_special_offer следующим образом:
для всех найденных строк запроса подсчитывается кол-во строк в wh_special_offer, где wh_special_offer.id_advert=wh_advert_ess_info.id
wh_advert_ess_info.id оно же adv_id, wh_advert.id 

текущий результат запроса
user posted image
PM MAIL   Вверх
triclosan
Дата 7.6.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



запрос некорректен (во всяком случае на первый взгляд) вы выбираете негруппируемые значения, этого очень плохо, лучше всего подробнее опишите вашу структуру данных.
PM MAIL   Вверх
vitamax
Дата 7.6.2011, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот схема связей.user posted image

пока рисовал, вспомнил свой один косяк. В таблице jos_datsogallery может не быть записи для данного wh_advert.id. Тогда jos_datsogallery.imgfilename должна вернуть пустую строку. Т.е. отсутствие записи в таблице jos_datsogallery  не должно исключать строку из выдачи. У меня это криво сделано. 
Здесь наверно следует вместо услвовия
Код

jos_datsogallery.advert_id = wh_advert.id AND jos_datsogallery.approved=1 

поставить
Код

jos_datsogallery.id = wh_advert.id_main_foto AND jos_datsogallery.approved=1 

но опять же отсутствие записи в jos_datsogallery не должно исключать строку из поиска. Просто должна вернуться пустая строка.

Вот немного расширенный запрос
Код

SELECT                        wh_advert_ess_info.id as adv_id, 
                            wh_advert_ess_info.num_of_guests AS People, 
                            wh_advert_ess_info.property_type, 
                            wh_region_spain.arg_region_name, 
                            wh_town_spain.name AS TownName, 
                            wh_advert.title,
                            jos_datsogallery.imgfilename, 
                            MIN( wh_advert_rental_rates.weekly_rate ) AS LowestOrderPrice, 
                            MAX( wh_advert_rental_rates.weekly_rate ) AS LargestOrderPrice
                            
FROM                        wh_advert_ess_info,
                            wh_advert, 
                            jos_datsogallery, 
                            wh_advert_rental_rates,
                            wh_region_spain,
                            wh_town_spain,
                            wh_advert_area_details,
                            wh_advert_eq_and_fac,
                            bookings
            
                            
WHERE                      wh_advert.activate=1 
                            AND
                            wh_advert.id NOT
                                IN (
                                       SELECT bookings.id_item
                                       FROM bookings 
                                       WHERE bookings.the_date
                                       BETWEEN "2010-07-13 00:00:00"
                                       AND "2011-07-13 23:59:59"
                                       GROUP BY bookings.id_item
                                     )                                    
                            AND
                            wh_region_spain.id = wh_advert_ess_info.region 
                            AND
                            wh_town_spain.id = wh_advert_ess_info.town 
                            AND
                            wh_advert_ess_info.id = wh_advert.id    
                            AND
                            wh_advert_eq_and_fac.id = wh_advert.id    
                            AND
                            wh_advert_area_details.id = wh_advert.id                            
                            AND
                            jos_datsogallery.advert_id = wh_advert.id AND jos_datsogallery.approved=1 
                            AND 
                            wh_advert_rental_rates.id = wh_advert.id   
GROUP BY wh_advert_rental_rates.id, wh_advert.id 

PM MAIL   Вверх
Zloxa
Дата 7.6.2011, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

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



Цитата(triclosan @  7.6.2011,  00:21 Найти цитируемый пост)
выбираете негруппируемые значения

Это mySQL. Увы, там такое безобразие допустимо.

Цитата(vitamax @  7.6.2011,  09:06 Найти цитируемый пост)
 В таблице jos_datsogallery может не быть записи для данного wh_advert.id. Тогда jos_datsogallery.imgfilename должна вернуть пустую строку. Т.е. отсутствие записи в таблице jos_datsogallery  не должно исключать строку из выдачи.

rtfm outer join

Добавлено через 4 минуты и 25 секунд
Цитата(vitamax @  6.6.2011,  23:15 Найти цитируемый пост)
Вопрос - как в этот запрос (в результирующую таблицу) добавить дополнительное поле _count, значение для которого берется из таблицы wh_special_offer следующим образом:
для всех найденных строк запроса подсчитывается кол-во строк в wh_special_offer, где wh_special_offer.id_advert=wh_advert_ess_info.id


Добавить соединение с таблицей wh_special_offer по критерию wh_special_offer.id_advert=wh_advert_ess_info.id и посчитать count(distinct wh_special_offer.id)

Это сообщение отредактировал(а) Zloxa - 7.6.2011, 09:23


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
vitamax
Дата 7.6.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вопрос тогда по основам  sql

вот работающий запрос с использованием LEFT OUTER JOIN
Код

SELECT     t.id AS adv_id, 
        t.title

FROM    wh_advert t

LEFT OUTER JOIN jos_datsogallery k ON k.id = t.id
AND        k.approved =1
WHERE    t.activate =1

AND t.id NOT 
    IN (
    SELECT bookings.id_item
    FROM bookings
    WHERE bookings.the_date
    BETWEEN  "2011-07-13 00:00:00"
    AND  "2012-07-13 23:59:59"
    GROUP BY bookings.id_item
    )



вопрос в том, как сделать выборку из двух таблиц и потом объединить с третьей
Код

SELECT t.id AS adv_id, t.title, p.num_of_guests AS People
FROM wh_advert t, wh_advert_ess_info p
LEFT OUTER JOIN jos_datsogallery k ON k.id = t.id
AND k.approved =1
WHERE t.activate =1
AND t.id NOT 
IN (


SELECT bookings.id_item
FROM bookings
WHERE bookings.the_date
BETWEEN  "2011-07-13 00:00:00"
AND  "2012-07-13 23:59:59"
GROUP BY bookings.id_item
)
AND p.id = t.id


выдает ошибку #1054 - Unknown column 't.id' in 'on clause' 

понятно, что нужно дать имя результирующей таблице, а не имена для каждой из таблиц (t, p). И здесь (ON k.id = t.id) использовать не таблицу t, а результирующую таблицу
PM MAIL   Вверх
triclosan
Дата 7.6.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Zloxa @  7.6.2011,  09:22 Найти цитируемый пост)
Это mySQL. Увы, там такое безобразие допустимо.

ага и коварный мускль даже не предупреждает о возможных неоднозначнастях
PM MAIL   Вверх
Zloxa
Дата 7.6.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

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



Цитата(triclosan @  7.6.2011,  15:12 Найти цитируемый пост)
не предупреждает

предупреждает.
но в документации ))

Добавлено через 3 минуты и 19 секунд
Цитата(vitamax @  7.6.2011,  14:41 Найти цитируемый пост)
FROM wh_advert t, wh_advert_ess_info p
LEFT OUTER JOIN jos_datsogallery k ON k.id = t.id

Код

FROM wh_advert t
inner join  wh_advert_ess_info p on p.id = t.id
LEFT OUTER JOIN jos_datsogallery k ON k.id = t.id




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
vitamax
Дата 7.6.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вроде получил нужный мне запрос.
Если есть какие-то явные недочеты, прошу высказаться smile
Код

SELECT          
                         t.id,                          
                         p.property_type,
                         p.num_of_guests AS People,
                         region.arg_region_name, 
                         town.name AS TownName,
                         t.title, 
                         foto.imgfilename,
                         MIN( rental.weekly_rate ) AS LowestOrderPrice,
                         MAX( rental.weekly_rate ) AS LargestOrderPrice
                                                 

FROM              
                         wh_advert  t

INNER JOIN   wh_advert_ess_info p on p.id = t.id
INNER JOIN   wh_region_spain region on region.id = p.region
INNER JOIN   wh_town_spain town on town.id = p.town
                   
LEFT OUTER JOIN   wh_advert_rental_rates rental on rental.id = t.id 
LEFT OUTER JOIN jos_datsogallery foto on  foto.id = t.id_main_foto     AND foto.approved=1     
                             
WHERE                     
                         t.activate=1 
                         AND
                         t.id NOT
                         IN (
                               SELECT bookings.id_item
                               FROM bookings 
                               WHERE bookings.the_date
                               BETWEEN "2011-07-13 00:00:00"
                               AND "2012-07-13 23:59:59"
                               GROUP BY bookings.id_item
                         )     
                         AND
                         p.id = t.id      

GROUP BY  t.id 


Добавлено @ 16:08
но вопрос-то остался

Цитата

есть таблица wh_special_offer:
id   -  auto_increment 
id_advert
type - tinyint(1)

Вопрос - как в этот запрос (в результирующую таблицу) добавить дополнительное поле _count, значение для которого берется из таблицы wh_special_offer следующим образом:
для всех найденных строк запроса подсчитывается кол-во строк в wh_special_offer, где wh_special_offer.id_advert=wh_advert.id



Это сообщение отредактировал(а) vitamax - 7.6.2011, 16:09
PM MAIL   Вверх
vitamax
Дата 7.6.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



всё, этот вопрос снят! ура)
Код

SELECT          
                         t.id,                          
                         p.property_type,
                         p.num_of_guests AS People,
                         region.arg_region_name, 
                         town.name AS TownName,
                         t.title, 
                         foto.imgfilename,
                         MIN( rental.weekly_rate ) AS LowestOrderPrice,
                         MAX( rental.weekly_rate ) AS LargestOrderPrice,
                         count (special.id_advert) as _count
                                                 
FROM              
                         wh_advert  t
INNER JOIN   wh_advert_ess_info p on p.id = t.id
INNER JOIN   wh_region_spain region on region.id = p.region
INNER JOIN   wh_town_spain town on town.id = p.town
                   
LEFT OUTER JOIN   wh_advert_rental_rates rental on rental.id = t.id 
LEFT OUTER JOIN jos_datsogallery foto on  foto.id = t.id_main_foto     AND foto.approved=1     
LEFT OUTER JOIN  wh_special_offer special on special.id_advert = t.id and special.deleted='0'
                             
WHERE                     
                         t.activate=1 
                         AND
                         t.id NOT
                         IN (
                               SELECT bookings.id_item
                               FROM bookings 
                               WHERE bookings.the_date
                               BETWEEN "2011-07-13 00:00:00"
                               AND "2012-07-13 23:59:59"
                               GROUP BY bookings.id_item
                         )     
                         AND
                         p.id = t.id      
GROUP BY  t.id

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


 




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


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

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