1

これら2つのクエリを結合する方法を考え出そうと、何時間も頭を悩ませてきました..

私の目標は、特定の基準に基づいて (会場から) 複数の会場行を返すことです...これが現在のクエリの動作です....

SELECT venues.id AS ven_id, 
   venues.venue_name, 
   venues.sub_category_id, 
   venues.score, 
   venues.lat, 
   venues.lng, 
   venues.short_description, 
   sub_categories.id, 
   sub_categories.sub_cat_name, 
   sub_categories.category_id, 
   categories.id, 
   categories.category_name, 
   ((ACOS(  SIN(51.44*PI()/180)*SIN(lat*PI()/180) + COS(51.44*PI()/180)*COS(lat*PI()/180)*COS((-2.60796 - lng)*PI()/180)) * 180/PI())*60 * 1.1515) AS dist

FROM venues, 
  sub_categories, 
  categories 
WHERE 
  venues.sub_category_id = sub_categories.id 
  AND sub_categories.category_id = categories.id 
HAVING 
  dist < 5 
ORDER BY score DESC 
LIMIT 0, 100

ただし、別のテーブル (venue_images) から取得した別のフィールド (サムネイル) をこのクエリに含める必要があります。アイデアは、関連する場所と順序に基づいて 1 つの画像行を抽出することです。ただし、抽出する必要があるのは 1 つの画像だけです。だからLIMIT 1。

基本的に、次のクエリを挿入する必要があります。

SELECT 
  venue_images.thumb_image_filename, 
  venue_images.image_venue_id,  
  venue_images.image_order 
FROM venue_images 
WHERE venue_images.image_venue_id = ven_id //id from above query
ORDER BY venue_images.image_order 
LIMIT 1

最初のクエリで、この新しいフィールドに「サムネイル」というラベルを付けます。

どんな助けでも本当に感謝します。ありがとう!

4

2 に答える 2

1

まず、INNER JOIN を使用して最初のクエリを作成できます。

SELECT
  ...
FROM
  venues INNER JOIN sub_categories ON venues.sub_category_id = sub_categories.id 
  INNER JOIN categories ON sub_categories.category_id = categories.id
HAVING
  ...

結果は同じはずですが、私はこれがもっと好きです。

次にやりたいことは、次のようなサブクエリを結合することです。

...
INNER JOIN (SELECT ... FROM venue_images 
              WHERE venue_images.image_venue_id = ven_id //id from above query
              ORDER BY venue_images.image_order 
              LIMIT 1) first_image

残念ながら、このサブクエリはven_id外側のクエリの前に最初に評価されるため (MySql の制限だと思います)、それを使用することができず、別の解決策を見つける必要があります。また、LIMIT 1 を使用しているため、必要な条件を JOINS だけで書き直すのは簡単ではありません。

MySql が FIRST() 集計関数を提供していれば簡単ですが、提供されていないため、シミュレートする必要があります。たとえば、次の質問を参照してください: How to fetch the first and last record of a grouped record in a MySQL query with集計関数?

したがって、このトリックを使用して、最初image_idにを抽出するクエリを作成できevery image_venue_idます。

SELECT
  image_venue_id,
  SUBSTRING_INDEX(
    GROUP_CONCAT(image_id order by venue_images.image_order),',',1) as first_image_id
FROM venue_images
GROUP BY image_venue_id

このクエリは、上記のクエリに統合できます。

SELECT
  ...
FROM
  venues INNER JOIN sub_categories ON venues.sub_category_id = sub_categories.id 
  INNER JOIN categories ON sub_categories.category_id = categories.id
  INNER JOIN (the query above) first_image on first_image.image_venue_id = venues.id
  INNER JOIN venue_images on first_image.first_image_id = venue_images.image_id
HAVING
  ...

また、最初のイメージ ID を実際のイメージと結合するために、もう 1 つの JOIN を追加しました。クエリを確認できませんでしたが、アイデアはこのように進めることです。

クエリはますます複雑になり管理が難しくなってきているため、すべての会場の最初の画像を抽出するビューを作成し、そのビューだけをクエリに結合する方がよいと思います。これは単なるアイデアです。それが機能するかどうか、または助けが必要な場合はお知らせください。

于 2012-11-06T21:48:40.117 に答える
0

あなたのデータについてはよくわかりませんが、サムネイルテーブルとの結合と大きなクエリでのグループ化はおそらくうまくいくでしょう。

GROUP BY venues.id
于 2012-11-06T20:35:44.483 に答える