0

これがクエリです。私がGROUP_CONCATを使用するものを取得するためのより良い方法があるかどうか、またはそれがこのデータを取得するための妖精の良い方法であるかどうか、私は主に興味があります。次に、それを分解し、ID /名前を配列に入れてから、forループを使用してそれらをエコーアウトします。

SELECT 
    mov_id, 
    mov_title, 
    GROUP_CONCAT(DISTINCT categories.cat_name) as all_genres, 
    GROUP_CONCAT(DISTINCT cat_id) as all_genres_ids,  
    GROUP_CONCAT(DISTINCT case when gen_dominant = 1 then gen_catid else 0 end) as dominant_genre_ids, 
    GROUP_CONCAT(DISTINCT actors.act_name) as all_actors, 
    GROUP_CONCAT(DISTINCT actors.act_id) as all_actor_ids, 
    mov_desc, 
    mov_added, 
    mov_thumb, 
    mov_hits, 
    mov_numvotes, 
    mov_totalvote, 
    mov_imdb, 
    mov_release, 
    mov_html, 
    mov_type,
    mov_buytickets,
    ep_summary,
    ep_airdate,
    ep_id,
    ep_hits,
    ep_totalNs,
    ep_totalRs,
    mov_rating,
    mov_rating_reason,
    mrate_name,
    dir_id, 
    dir_name
FROM movies
LEFT JOIN _genres
    ON movies.mov_id = _genres.gen_movieid
LEFT JOIN categories
    ON _genres.gen_catid = categories.cat_id
LEFT JOIN _actors
    ON (movies.mov_id = _actors.ac_movid)
LEFT JOIN actors
    ON (_actors.ac_actorid = actors.act_id AND act_famous = 1)
LEFT JOIN directors
    ON movies.mov_director = directors.dir_id
LEFT JOIN movie_ratings
    ON movies.mov_rating = movie_ratings.mrate_id
LEFT JOIN episodes
    ON mov_id = ep_showid AND ep_season = 0 AND ep_num = 0
WHERE mov_id = *MOVIE_ID* AND mov_status = 1 
GROUP BY mov_id

クエリの説明はこちら

代替テキストhttp://www.krayvee.com/o2/explain.gif

4

2 に答える 2

1

個人的には、クエリを複数のクエリに分割しようとします。ほとんどの場合、これらのgroup_concat関数をすべて削除できるように、アクターとジャンルの結合を削除することをお勧めします。次に、個別のクエリを実行してこのデータを引き出します。それが物事をスピードアップするかどうかはわかりませんが、おそらく一見の価値があります。

于 2009-06-25T02:11:58.427 に答える
0

基本的に、、、、、およびの間でデカルト積を実行しgenresました。これが、の内部で使用する必要がある理由です。事前にグループ化された結果セットには、関連する各テーブルの一致する行の数の積に等しい行数があるためです。actorsdirectorsmovie_ratingsepisodesDISTINCTGROUP_CONCAT()

このクエリは、単一値ルールを許容するMySQLを使用している場合を除いて、SQLではまったく機能しないことに注意してください。

@Kibbeeのように、私は通常、このような場合に別々のクエリを実行することをお勧めします。単一のクエリを実行することが常に良いとは限りません。クエリを分割し、プロファイリングを実行してみてください。

PS:何ですか?_directorsテーブルがありませんか?では、複数のディレクターで動きを表現することはできませんか?:-)

于 2009-06-25T02:16:21.023 に答える