クエリ内で使用する7つのテーブルがあります。
tb_post, tb_spots, users, td_sports, tb_spot_types, tb_users_sports, tb_post_media
これは私が使用しているクエリです:
SELECT po.id_post AS id_post,
po.description_post as description_post,
sp.id_spot as id_spot,
po.date_post as date_post,
u.id AS userid,
u.user_type As tipousuario,
u.username AS username,
spo.id_sport AS sportid,
spo.sport_icon as sporticon,
st.logo_spot_type as spottypelogo,
sp.city_spot AS city_spot,
sp.country_spot AS country_spot,
sp.latitud_spot as latitudspot,
sp.longitud_spot as longitudspot,
sp.short_name AS spotshortname,
sp.verified_spot AS spotverificado,
u.profile_image AS profile_image,
sp.verified_spot_by as spotverificadopor,
uv.id AS spotverificador,
uv.user_type AS spotverificadornivel,
pm.media_type AS mediatype,
pm.media_file AS mediafile,
GROUP_CONCAT(tus.user_sport_sport) sportsdelusuario,
GROUP_CONCAT(logosp.sport_icon) sportsdelusuariologos,
GROUP_CONCAT(pm.media_file) mediapost,
GROUP_CONCAT(pm.media_type) mediaposttype
FROM tb_posts po
LEFT JOIN tb_spots sp ON po.spot_post = sp.id_spot
LEFT JOIN users u ON po.uploaded_by_post = u.id
LEFT JOIN tb_sports spo ON sp.sport_spot = spo.id_sport
LEFT JOIN tb_spot_types st ON sp.type_spot = st.id_spot_type
LEFT JOIN users uv ON sp.verified_spot_by = uv.id
LEFT JOIN tb_users_sports tus ON tus.user_sport_user = u.id
LEFT JOIN tb_sports logosp ON logosp.id_sport = tus.user_sport_sport
LEFT JOIN tb_post_media pm ON pm.media_post = po.id_post
WHERE po.status = 1
GROUP BY po.id_post,uv.id
一部のGROUP_CONCATグループで問題が発生しています。
GROUP_CONCAT(tus.user_sport_sport) sportsdelusuario
私に正しいアイテムを与えていますが、繰り返されます、すべてのアイテムは2回
GROUP_CONCAT(logosp.sport_icon) sportsdelusuariologos
私に正しいアイテムを与えていますが、繰り返されます、すべてのアイテムは2回
GROUP_CONCAT(pm.media_file) mediapost
私に正しいアイテムを与えていますが、4回繰り返されています
GROUP_CONCAT(pm.media_type) mediaposttype
s私に正しいアイテムを与えますが、4回繰り返しました
必要に応じて、ここにすべてのテーブル構造を配置できます。
クエリで結合された複数の1対多の関係は、集計結果に乗法的影響を及ぼします。標準ソリューションはサブクエリです。
あなたになら変えられる
GROUP_CONCAT(pm.media_type) mediaposttype
...
LEFT JOIN tb_post_media pm ON pm.media_post = po.id_post
に
pm.mediaposttype
...
LEFT JOIN (
SELECT media_post, GROUP_CONCAT(media_type) AS mediaposttype
FROM tb_post_media
GROUP BY media_post
) AS pm ON pm.media_post = po.id_post
tb_post_mediaが非常に大きく、po.status = 1
外部クエリの条件によってサブクエリの結果が大幅に減少する場合は、サブクエリ内で元の結合を複製して結果をフィルタリングする価値があります。
同様に、コメントで述べた相関バージョンも、外部クエリの結果が比較的少ない場合、パフォーマンスが向上する可能性があります。(それぞれのGROUP_CONCAT()を個別に計算することは、後者の結果のごく一部しか実際に使用しない場合、一度だけ計算するよりもコストがかからない可能性があります)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加