0

Zend Framework で使用したいかなり複雑なクエリがあります。これを行うには、クエリをサブクエリから結合に変換する必要がありました。

これは取り引きです: 適切な情報を形成するために接続する必要がある 3 つのテーブルがあります。これは、次のクエリを使用して実行できます。

SELECT 
 ol.orders_id, 
 ol.photos_to_add, 
 ol.locations_id, 
 l.name, 
 (select 
   count(*) 
  from 
   photos as p 
  where 
   p.location_id = ol.locations_id and p.per_order = ol.orders_id) 
  as added 
FROM `order_has_locations` AS ol, 
 `locations` AS l 
WHERE ol.orders_id = 1 and l.id = ol.locations_id

私はそれを結合に変換しようとします:

SELECT ol.orders_id, ol.locations_id, ol.photos_to_add, l.name, count(p.id) AS added
FROM order_has_locations as ol
INNER JOIN locations as l on l.id = ol.locations_id
left outer join photos as p on p.per_order = ol.orders_id
where p.location_id = ol.locations_id and ol.orders_id = 1

ただし、この方法では、0枚の写真に関する情報が欠落しています。

色々な方法を試しましたがダメでした…

4

2 に答える 2

0

集計関数にはGROUPBYを使用する必要があります。また、左結合は定義上外部結合であるため、指定する必要はありません。

SELECT ol.orders_id, ol.locations_id, ol.photos_to_add, l.name, count(p.id) AS added
FROM order_has_locations as ol
INNER JOIN locations as l on l.id = ol.locations_id
LEFT JOIN photos as p on p.per_order = ol.orders_id
where p.location_id = ol.locations_id and ol.orders_id = 1
GROUP BY p.id
于 2012-07-14T00:51:34.243 に答える
0

これは、p.location_id = ol.locations_idが原因で、この条件を結合句の場所から移動すると、機能するはずです。現在、where句にあるように、結合が評価された後に適用されます。したがって、0枚の写真の場合、この条件はp.location_id = nullであることが判明します。これは偽であり、したがって行は除外されます。

SELECT ol.orders_id, ol.locations_id, ol.photos_to_add, l.name, count(p.id) AS added
  FROM order_has_locations as ol
 INNER JOIN locations as l on l.id = ol.locations_id
  LEFT outer join photos as p on p.per_order = ol.orders_id 
   AND p.location_id = ol.locations_id 
 WHERE ol.orders_id = 1
 GROUP BY ol.orders_id, ol.locations_id, ol.photos_to_add, l.name 
于 2012-07-13T19:11:02.967 に答える