2016-05-29 10 views
0

2つの動作中のSQLステートメントを1つの動作中のSQLステートメントに結合しようとしています。エラーを引き起こす複雑なMySQLステートメント

この最初のものは、すべての製品および製品が入っているお店、そして製品が持っているカテゴリを選択し、中にあるお店のために:ここでは

は別々に行われ、各作業という2つのSQL文です特定の領域。ウェブサイト上に商品を表示した後、各商品の下に商品の店舗やカテゴリを掲載するためのものです。私の上のSQL文の

SELECT p.p_id, p.`p_name`, p.brand, 
GROUP_CONCAT(DISTINCT CONCAT(c.c_id, ':', c.c_name) SEPARATOR ', ') as categories, 
GROUP_CONCAT(DISTINCT CONCAT(s.s_id, ':', s.s_name) SEPARATOR ', ') as shops 
FROM product p 
INNER JOIN product_category pc on p.p_id = pc.p_id 
INNER JOIN category c ON c.c_id = pc.c_id 
INNER JOIN product_shop ps on p.p_id = ps.p_id 
INNER JOIN shop s ON s.s_id = ps.s_id 
WHERE s.street = 'college hill' 
AND s.city = 'auckland' 
AND s.province = 'auckland' 
AND s.country = 'new zealand' 
AND s.postalCode = '1011' 

結果は次のようになります。

enter image description here

重要:私は、次のSQL文のために重要であるショップテーブルに追加緯度と経度フィールド以来持っていますこの質問の

この第2のSQL文は、this link that finds the closest 20 shops to a latlong coordinate in a table of shopsから取得されています。私は私のデータベースで動作するように適応している:

SELECT s_id, (3959 * acos(cos(radians(-36.8473223 
)) * cos(radians(latitude)) * cos(radians(longitude) - radians(174.744227 
)) + sin(radians(-36.8473223 
)) * sin(radians(latitude)))) AS distance FROM shop HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

それは、この結果を与える:

enter image description here

したがって、これら2つのSQLステートメントを結婚によって、私はお店にに最も近い製品を選択することができますウェブサイト上に商品を表示するための緯度座標、各商品の店舗およびカテゴリを表示します。

私がしようとしているのは、指定された緯度と経度座標(Googleオートコンプリート場所オブジェクトでユーザーが入力した)からショップの距離をショップ選択結果に追加することです。この質問のトップSQLステートメントだから店舗の結果では、各店舗のために5.897のようなものになります距離の結果を追加します。そして、最も近い距離の項目を返します。

SELECT p.p_id, 
    p.`p_name`, 
    p.brand, 
    GROUP_CONCAT(DISTINCT CONCAT(c.c_id, ':', c.c_name) SEPARATOR ', ' 
    ) as categories, 
    GROUP_CONCAT(DISTINCT CONCAT(s.s_id, ':', s.s_name, ':', 
(3959 * acos(cos(radians(-36.8473223 
    )) * cos(radians(s.latitude)) * cos(radians(s.longitude) - radians(174.744227 
    )) + sin(radians(-36.8473223 
    )) * sin(radians(s.latitude)))) AS distance) SEPARATOR ', ' 
    ) as shops 
    FROM 
    product p 
    INNER JOIN product_category pc on p.p_id = pc.p_id 
    INNER JOIN category c ON c.c_id = pc.c_id 
    INNER JOIN product_shop ps on p.p_id = ps.p_id 
    INNER JOIN shop s ON s.s_id = ps.s_id HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

私はこのエラーを取得しています:ここで

は私の現在の試みです

1583 - Incorrect parameters in the call to native function 'CONCAT'

私は、エラーを修正するために何ができますか?以下の答えから

結果:

enter image description here

答えて

1

はあなたの連結内の「距離として」、それから「ショップ」としてgorupの連結を仕上げています。

私はあなたのクエリを書き換えました。ショップからのPREQUERYはあなたの距離を計算し、あなたの限界は20エントリーです...それからそれはチェーンの残りの部分に加わります。 「距離」は計算された列なので、これをconcat文で使用できるようになりました。

SELECT 
     p.p_id, 
     p.p_name, 
     p.brand, 
     GROUP_CONCAT(DISTINCT CONCAT(c.c_id, ':', c.c_name) 
     SEPARATOR ', ') as categories, 
     GROUP_CONCAT(DISTINCT CONCAT(s.s_id, ':', s.s_name, ':', 
     s.distance) SEPARATOR ', ') as shops 
    from 
     (SELECT 
       s_id, 
       s.s_name, 
       (3959 
       * acos(cos(radians(-36.8473223)) 
       * cos(radians(latitude)) 
       * cos(radians(longitude) 
       - radians(174.744227)) 
       + sin(radians(-36.8473223)) 
       * sin(radians(latitude)))) AS distance 
      FROM 
       shop 
      HAVING 
       distance < 25 
      ORDER BY 
       distance 
      LIMIT 
       0, 20) s 
     INNER JOIN product_shop ps 
     ON s.s_id = ps.s_id 
     INNER JOIN product p 
      on ps.p_id = p.p_id 
      INNER JOIN product_category pc 
       on p.p_id = pc.p_id 
       INNER JOIN category c 
        ON pc.c_id = c.c_id 
    group by 
     p.p_id, 
     p.p_name, 
     p.brand 
+0

うわー、素晴らしい、ありがとう。何らかの理由で、私は結果に1行しか戻っていません。期待された結果は、私はデータベースに戻ってきたその行のように、すべての製品を取得することです。これは約16の製品なので、戻って来たもののような16行です。データベースには2店舗しかありませんが、どちらも戻ってきた製品の結果に戻ってきました。すべての製品は、2つのショップのいずれか、またはその両方にあります。私は他の製品がなぜ結果に返されないのかを理解する必要があります。なぜあなたはそれが1列の感謝を返すだけの理由を知っているか教えてください! – BeniaminoBaggins

+0

返信する結果は、私の質問 – BeniaminoBaggins

+0

@Beniamino_Bagginsの下にGROUP BYを追加して掲載されています。あなたの元のクエリはグループbyを持っていなかったので、group_concatで常に1つの行だけを返します。やってみよう。 – DRapp

関連する問題