0

機能している次のクエリがあります。

$query = "SELECT 
   a.student_name, 
   city, 
   state, 
   request_date, 
   lat, 
   lng, 
   (3959 * acos( 
      cos( radians('".mysql_real_escape_string($center_lat)."') ) 
      * cos( radians( lat ) ) 
      * cos( radians( lng ) - radians('".mysql_real_escape_string($center_lng)."') ) 
      + sin( radians('".mysql_real_escape_string($center_lat)."') ) 
      * sin( radians( lat ) ) 
      ) 
   ) AS distance 
   FROM lesson_requests a
   INNER JOIN (
      SELECT student_name, MAX(request_date) AS MaxRequestDate
      FROM lesson_requests
      WHERE ( 
        3959 * acos( 
          cos( radians('".mysql_real_escape_string($center_lat)."') ) 
          * cos( radians( lat ) ) 
          * cos( radians( lng ) 
          - radians('".mysql_real_escape_string($center_lng)."') ) 
          + sin( radians('".mysql_real_escape_string($center_lat)."') ) 
          * sin( radians( lat ) ) ) 
      ) < ".mysql_real_escape_string($radius)." 
      GROUP BY student_name
   ) b
   ON a.student_name = b.student_name
   AND a.request_date = b.MaxRequestDate
   HAVING distance < ".mysql_real_escape_string($radius)." 
   ORDER BY distance 
   LIMIT 0 , 10";

私がやろうとしているのは、別のテーブルを「vendor」というクエリに結合することです。そのテーブルには「user_purchased」という値があり、完全なクエリの最後にあるフィルターの 1 つとして、「vendor」という名前のテーブルの「user_purchased」に「abc_company」という単語が含まれていないことを確認する必要があります。このようにMATCHを使用する

...AND NOT MATCH(user_purchased) AGAINST ('abc_company')

この追加テーブルの結合について誰か助けてくれませんか?

前もって感謝します!

4

2 に答える 2

2

そこには多くのことが起こっています...

まず、HAVING は、対応する GROUP BY とのみ使用する必要があります。GROUP BY はサブクエリに適用されます (テーブルと考えてください)。そこに WHERE 句が必要だと思います。

自己結合 (*lesson_requests INNER JOIN (lesson_requests からのものを選択する*) も少し混乱しますが、あなたが何をしようとしているのかはわかります (つまり、最大要求日で生徒ごとのレコードを取得します)。

最後に、「name」のような varchar は、通常、不適切な主キーになります。ある種の整数の学生 ID 代理キーを作成し、代わりにそれを使用することを検討してください。

とにかく、次のようなものが欲しいと思います:

SELECT student_name, 
       city, 
       state, 
       request_date, 
       lat, 
       lng, 
       <<DISTANCE COLUMN>> AS distance, 
       vendor.user_purchased
FROM lesson_requests 
INNER JOIN 
   (
    SELECT student_id, MAX(request_date) AS max_request_date
    FROM lesson_requests
    WHERE <<COMPLEX CONDITION>>
    GROUP BY student_name
   ) AS recent_student_lesson_request
   ON  lesson_requests.student_name = recent_student_lesson_request.student_name
       AND lesson_requests.request_date = recent_student_lesson_request.max_request_date
LEFT JOIN vendor ON v.user_purchased = lesson_requests.student_name
WHERE vendor.user_purchased <> 'abs_company'
    AND distance < BLAH;

これは、vendor テーブルに OPTIONAL テーブルとして結合し、vendor テーブルの user_purchased が student_name に対応すると仮定します。その仮定が当てはまらない場合は、 vendor と lesson_requests がどのように関連しているかを理解し、それらの列を使用して結合を行う必要があります。

これは、特定の学生名がベンダー テーブルに表示されない場合でもレコードを出力します (明らかに、ベンダーではない学生はベンダー 'abc_company' になることはできないため)。

于 2012-06-13T23:01:33.310 に答える
0

私がそれを正しく理解していれば、「AND table.user_purchased != ''abc_company''」を追加できます。これで問題が解決します

于 2012-06-13T22:44:11.867 に答える