0

できる限り説明しようと思います。さまざまなテーブルからレコードをフェッチするための次のクエリがあります。

SELECT 
  p.p_name,
  p.id,
  cat.cat_name,
  p.property_type,
  p.p_type,
  p.address,
  c.client_name,
  p.price,
  GROUP_CONCAT(pr.price) AS c_price,
  pd.land_area,
  pd.land_area_rp,
  p.tagline,
  p.map_location,
  r.id,
  p.status,
  co.country_name,
  p.`show`,
  u.name,
  p.created_date,
  p.updated_dt,
  o.type_id,
  p.furnished,
  p.expiry_date 
FROM
  property p 
  LEFT OUTER JOIN region AS r 
    ON p.district_id = r.id 
  LEFT OUTER JOIN country AS co 
    ON p.country_id = co.country_id 
  LEFT OUTER JOIN property_category AS cat 
    ON p.cat_id = cat.id 
  LEFT OUTER JOIN property_area_details AS pd 
    ON p.id = pd.property_id 
  LEFT OUTER JOIN sc_clients AS c 
    ON p.client_id = c.client_id 
  LEFT OUTER JOIN admin AS u 
    ON p.adminid = u.id 
  LEFT OUTER JOIN sc_property_orientation_type AS o 
    ON p.orientation_type = o.type_id 
  LEFT OUTER JOIN property_amenities_details AS pad 
    ON p.id = pad.property_id 
  LEFT OUTER JOIN sc_commercial_property_price AS pr 
    ON p.id = pr.property_id 
WHERE p.id > 0 
  AND (
    p.created_date > DATE_SUB(NOW(), INTERVAL 1 YEAR) 
    OR p.updated_dt > DATE_SUB(NOW(), INTERVAL 1 YEAR)
  ) 
  AND p.p_type = 'sale' 

GROUP_CONCAT(pr.price) AS c_price,上記のクエリから除外すると、すべて正常に機能します。しかし、これを含めると、1つの結果しか得られません。上記のグループ連結を使用する意図はsc_commercial_property_price、この場合はプロパティIDに一致するテーブルからコンマ区切りの価格をフェッチすることp.idです。プロパティのレコードがに存在する場合は、sc_commercial_property_price他のレコードと一緒にカンマ区切り形式でフェッチします。そうでない場合は、空白を返す必要があります。私はここで何を間違えていますか?

問題が明確でない場合は、もう一度説明します。前もって感謝します

4

2 に答える 2

1

GROUP_CONCAT集計関数です。これを含めると、集計があることを SQL に伝えます。がない場合、次のGROUP BYように 1 行のみが返されます。

select count(*)
from table

あなたが持っているクエリは、MySQL では受け入れられる構文ですが、他のデータベースでは受け入れられません。クエリは、関数のない列によって自動的にグループ化されません。代わりに、任意の値を返します。function を想像できるANYので、クエリは次のとおりです。

select any(p.p_name) as p_num, any(p.tagline) as tagline, . . .

これを修正するには、現在のすべての変数を group by 句に入れます。

GROUP BY
  p.p_name,
  p.id,
  cat.cat_name,
  p.property_type,
  p.p_type,
  p.address,
  c.client_name,
  p.price,
  pd.land_area,
  pd.land_area_rp,
  p.tagline,
  p.map_location,
  r.id,
  p.status,
  co.country_name,
  p.`show`,
  u.name,
  p.created_date,
  p.updated_dt,
  o.type_id,
  p.furnished,
  p.expiry_date 

SQL を作成するほとんどの人は、すべての group by 変数をgroup by句に含めるのが適切な形式であると考えていますが、MySQL では必ずしもこれが必要というわけではありません。

于 2012-09-24T18:03:15.917 に答える
1

GROUP BY別々の行を持ちたいものを列挙する句を追加します。ここで何が起こるかというと、結果列ごとに何らかのgroup_concat値が選択され、すべてがs になりpr.priceます。

于 2012-09-24T17:21:17.513 に答える