Предложение множественного соединения с использованием suqbqueries с множественным где - PullRequest
0 голосов
/ 08 мая 2018

У меня есть 4 таблицы:

ad
image
placement
ad_placement - many to many intermediary table between ad and placement

изображение имеет FK для объявления

Структура выглядит так:

ad

id | url

1   http://
2   http://
3   http:// 


placement

id | name

1    name_1
1    name_2


ad_placement

id | ad_id | PLACEMENT_ID 1 1 1 2 1 2 3 2 2

image

id  | image    | ad_id 
1     http://    1
2     http://    2
3     http://    3

Я хочу получить поля, URL из рекламы и изображения из изображения, где размещение = name_1

'**' в запросе только для того, чтобы показать, что я имею в виду

  SELECT A.id, A.url, I.image as image 
  FROM ad AS A LEFT JOIN (       
  SELECT ADP.ad_id FROM ad_placement *AS ADP*
  JOIN placement AS P ON ADP.placement_id = P.id **WHERE P.name='name_1'**) AS AP ON A.id=AP.ad_id  
  LEFT JOIN ( SELECT ad_id,image FROM image) AS I ON I.ad_id = A.id 
  WHERE A.is_active=TRUE

Я получаю сообщение об ошибке, когда пытаюсь использовать where в этой строке

JOIN ads_adplacement AS P ON ADP.adplacement_id = P.id WHE...

missing FROM-clause entry for table "adp"

удаление «Где» работает, но это не то, что мне нужно


Я добавил ADP в соответствии с предложением (курсивом см. **), получив те же результаты, например, где предложение игнорируется

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Не могли бы вы поделиться полным запросом, я хочу посмотреть, куда вы добавляете предложение where. Однако кажется, что вы добавляете где-то между двумя соединениями. Где можно добавить после объединения всех таблиц.

EDIT

SELECT A.id, A.url, I.image as image 
FROM ad AS A 
LEFT JOIN ad_placement AS AP ON A.id=AP.ad_id
LEFT JOIN placement AS P ON AP.placement_id = P.id
LEFT JOIN image I ON I.ad_id = A.id 
WHERE A.is_active=TRUE and P.name='name_1'
0 голосов
/ 08 мая 2018

Какой смысл первого левого соединения?

SELECT A.id, A.url, I.image as image 
  FROM ad AS A 
  LEFT JOIN image AS I ON I.ad_id = A.id 
  WHERE A.is_active=TRUE

РЕДАКТИРОВАТЬ: Возможно, вы имеете в виду это.

SELECT A.id, A.url, I.image as image 
  FROM ad AS A 
  LEFT JOIN image AS I ON I.ad_id = A.id 
  WHERE A.is_active=TRUE and
  a.id in 
  (select ad_id 
   from ad_placement adp 
   inner join placement p on p.Id = adp.placement_id 
   where p.Name='name 1');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...