SQL Sub-выбрать в качестве поля? - PullRequest
1 голос
/ 04 февраля 2011

Я немного растерялся здесь ...

У меня есть несколько таблиц, из которых я хотел бы получить объединенную запись: Unit, Building, Owner и Picture.

Вот мой запрос на данный момент:

SELECT building.`Street_Address`
    , building.`Building_Name`
    , building.`Building_Type`
    , CONCAT(building.`Cross_Street_1`, ' & ', building.`Cross_Street_2`) Cross_Streets
    , building.`Cross_Street_1`
    , building.`Cross_Street_2`
    , building.`Access` Building_Access
    , owner.`Company_Name`
    , owner.`Contact_Or_Reference`
    , owner.`Landlord_Phone`
    , picture.`Path_To_Picture_On_Server`
    , picture.`Picture_Category`
    , unit.`Apartment_Number`
    , unit.`Unit_Size_Number` Size
    , unit.`Is_Doorman`
    , unit.`Is_Furnished`
    , unit.`Is_Elevator`
    , unit.`Is_Pets`
    , unit.`Is_OutdoorSpace`
    , unit.`Rent_Price`
    , unit.`Baths`
    , unit.`Access` Unit_Access
    , unit.`fourd_id`
    , unit.`Updated_Date`
    , unit.`Occupancy_Date`
    , unit.`Term`
    , unit.`Incentives`
    , unit.`Info_OutdoorSpace`
    , unit.`List_Date`
    , zone.`Description`
FROM 4D_Units unit
JOIN 4D_Building building
    ON unit.`BUILDING_RecID` = building.`fourd_id`
JOIN 4D_Zones zone
    ON building.`ZONES_RecID` = zone.`fourd_id`
LEFT JOIN 4D_Owners owner
    ON unit.`OWNER_RecID` = owner.`fourd_id`
LEFT JOIN 4D_Building_Picts picture
    ON (building.`fourd_id` = picture.`BUILDING_RecID` AND picture.`Picture_Category` = 'Front')
WHERE unit.`id` = 49901

Это работает нормально, как есть, за исключением того, что в возвращаемой записи будет только изображение "Front" в записи (если есть),Моя проблема в том, что есть несколько разных типов фотографий, которые могут быть связаны с возвращаемой записью, включая «Панорама», «Интерьер» и «План этажа» ... все это разные возможные значения для picture.Picture_Category.

Есть ли способ вернуть эти значения (если они присутствуют, как указано выше) в возвращенном наборе без выполнения отдельного запроса?Я хочу, чтобы возвращаемый набор включал (если присутствует) псевдонимы для всех четырех возможных вариантов picture.Picture_Category: «Фронт», «Панорама», «Интерьер» и «План этажа» (с их уникальными picture.Path_To_Picture_On_Server, связанными с ним).

Имеет ли это смысл?

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Если я вас правильно понимаю, вы хотите, чтобы в вашем наборе результатов было 4 набора графических столбцов - одна из четырех категорий? Прямо сейчас у вас есть только один для фронта, верно?

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

select 
    --whatever
    , pic_front.`Path_To_Picture_On_Server` AS Front_Path_To_Picture_On_Server
    , pic_panorama.`Path_To_Picture_On_Server` AS Panorama_Path_To_Picture_On_Server
    , pic_interior.`Path_To_Picture_On_Server` AS Interior_Path_To_Picture_On_Server
    , pic_floorplan.`Path_To_Picture_On_Server` AS Floorplan_Path_To_Picture_On_Server
    --whatever
FROM 4D_Units unit
JOIN 4D_Building building
    ON unit.`BUILDING_RecID` = building.`fourd_id`
JOIN 4D_Zones zone
    ON building.`ZONES_RecID` = zone.`fourd_id`
LEFT JOIN 4D_Owners owner
    ON unit.`OWNER_RecID` = owner.`fourd_id`
LEFT JOIN 4D_Building_Picts pic_front
    ON (building.`fourd_id` = pic_front.`BUILDING_RecID` AND pic_front.`Picture_Category` = 'Front')
LEFT JOIN 4D_Building_Picts pic_panorama
    ON (building.`fourd_id` = pic_panorama.`BUILDING_RecID` AND pic_panorama.`Picture_Category` = 'Panorama')
LEFT JOIN 4D_Building_Picts pic_interior
    ON (building.`fourd_id` = pic_interior.`BUILDING_RecID` AND pic_interior.`Picture_Category` = 'Interior')
LEFT JOIN 4D_Building_Picts pic_floorplan
    ON (building.`fourd_id` = pic_floorplan.`BUILDING_RecID` AND pic_floorplan.`Picture_Category` = 'Floorplan')
WHERE unit.`id` = 49901
0 голосов
/ 04 февраля 2011

Я думаю, вы хотите функцию объединения.Он принимает несколько полей и возвращает первое из них ненулевое.Итак, что-то вроде:

Select
  Coalesce(A.Panorama, A.Interior, A.Floorplan, '') as ImagePath
From
  Table A

Таким образом, в итоге вы получите только одно значение, которое на самом деле может не соответствовать вашему.Если вам нужны все из них, я бы предложил использовать коррелированные подзапросы, например:

Select
  (Select P.Path_To_Picture From 4D_Building_Picts P where P.Building_RecID = B.fourd_Id And P.Picture_Category = 'Front') as Front_Pic,
  (Select P.Path_To_Picture From 4D_Building_Picts P where P.Building_RecID = B.fourd_Id And P.Picture_Category = 'Panorama') as Panamora_Pic,
  (Select P.Path_To_Picture From 4D_Building_Picts P where P.Building_RecID = B.fourd_Id And P.Picture_Category = 'FloorPlan') as FloorPlan_Pic,
  ...
From
  4D_Building B
...