2016-10-16 7 views
2

合計参加者、総コメント数、総数累計数を含むクエリを注文したいと考えています。しかし、これは動作していません。どんな解決策ですか?Mysql - Order by Sqlクエリ

このクエリは、ユーザー数が増えたときにサーバーにとって非常に難しくなりますが、クエリを最適化するための提案はありますか?ありがとう。

SELECT P.*, 
    distance_in_meters_lat_lng(P.post_latitude, P.post_longitude, :latitude, :longitude) as distance, 
    U.user_id, 
    U.user_name, 
    U.user_lastName, 
    U.user_photo, 
    LT.time_hour, 
    LC.category_name, 
    (SELECT COUNT(*) FROM posts_likes PL WHERE PL.post_id = P.post_id) as likes, 
    (SELECT COUNT(*) FROM comments C WHERE C.post_id = P.post_id) as comments, 
    (SELECT COUNT(*) FROM posts_likes PL2 WHERE PL2.post_id = P.post_id AND PL2.user_id = :user_id) as like_status, 
    (SELECT COUNT(*) FROM post_participants PC WHERE PC.post_id = P.post_id) as participants, 
    (SELECT COUNT(*) FROM post_participants PC2 WHERE PC2.post_id = P.post_id AND PC2.user_id = :user_id) as participant_status, 
    (SELECT user_id FROM post_participants PC3 WHERE PC3.post_id = P.post_id AND is_winner = 1) as winner, 
    (SELECT user_name FROM post_participants PC3 WHERE PC3.post_id = P.post_id AND is_winner = 1) as name, 
    (SELECT user_lastName FROM post_participants PC3 WHERE PC3.post_id = P.post_id AND is_winner = 1) as lastName, 
    (SELECT user_photo FROM post_participants PC3 WHERE PC3.post_id = P.post_id AND is_winner = 1) as photo 
    FROM posts P 
    INNER JOIN users U USING(user_id) 
    LEFT JOIN lot_times LT USING(time_id) 
    LEFT JOIN lot_categories LC USING(category_id) 
    WHERE P.user_id NOT IN (:list) 
    AND P.post_type = 'lot' 
    ORDER BY participants, likes, comments DESC 
    LIMIT 0, 20 
+0

間違いでは? – scaisEdge

+0

いいえ、エラーはありません。しかし、順序は正しくありません。 –

答えて

0

に役立ちます。

SELECT P.*, 
      distance_in_meters_lat_lng(P.post_latitude, P.post_longitude, :latitude, :longitude) as distance, 
      U.user_id, 
      U.user_name, 
      U.user_lastName, 
      U.user_photo, 
      LT.time_hour, 
      LC.category_name, 
      (SELECT COUNT(*) FROM posts_likes PL WHERE PL.post_id = P.post_id) as likes, 
      (SELECT COUNT(*) FROM comments C WHERE C.post_id = P.post_id) as comments, 
      (SELECT COUNT(*) FROM posts_likes PL2 WHERE PL2.post_id = P.post_id AND PL2.user_id = :user_id) as like_status, 
      (SELECT COUNT(*) FROM post_participants PC WHERE PC.post_id = P.post_id) as participants, 
      (SELECT COUNT(*) FROM post_participants PC2 WHERE PC2.post_id = P.post_id AND PC2.user_id = :user_id) as participant_status, 
      (SELECT user_id FROM post_participants PC3 WHERE PC3.post_id = P.post_id AND is_winner = 1) as winner, 
      (SELECT user_name FROM post_participants PC3 WHERE PC3.post_id = P.post_id AND is_winner = 1) as name, 
      (SELECT user_lastName FROM post_participants PC3 WHERE PC3.post_id = P.post_id AND is_winner = 1) as lastName, 
      (SELECT user_photo FROM post_participants PC3 WHERE PC3.post_id = P.post_id AND is_winner = 1) as photo 
    FROM posts P 
    INNER JOIN users U USING(user_id) 
    LEFT JOIN lot_times LT USING(time_id) 
    LEFT JOIN lot_categories LC USING(category_id) 
    WHERE P.post_type = 'lot' 
    ORDER BY participants DESC, likes DESC, comments DESC 
    LIMIT 0,20 
0

あなたはとにかくあなたのクエリでjoinを使用しているように、私は、例えば、コメントに参加すると、テーブルが好きお勧めしますし、選択中のカウントになるだろう。:

select p.id, count(l.id) as like_count, count(c.id) as comment_count 
from post p 
left join likes l on p.id = l.post_id 
left join comments c on p.id = c.post_id 
order by like_count desc, comment_count desc; 

ここでは、SQL Fiddleです。

+0

私は多くの情報を得ているので、できません。私はSQLクエリを更新しました。 –

1

このクエリは本当に大きいので、サブクエリは間違いなく時間がかかります。ここでは直接使用する必要があります。

ホープこれは私が自分自身に答えるた最後

SELECT 
    P.*, 
    distance_in_meters_lat_lng(P.post_latitude, P.post_longitude, :latitude, :longitude) as distance, 
    U.user_id, 
    U.user_name, 
    U.user_lastName, 
    U.user_photo, 
    LT.time_hour, 
    LC.category_name, 
    COUNT(PL.*) as likes, 
    COUNT(C.*) as comments, 
    COUNT(PL2.*) as like_status, 
    COUNT(PC.*) as participants, 
    COUNT(PC2.*) as participant_status, 
    PC3.user_id as winner, 
    PC3.user_name as name, 
    PC3.user_lastName as lastName, 
    PC3.user_photo as photo, 
FROM 
    posts P 
JOIN 
    posts_likes PL USING (post_id) 
JOIN 
    comments C USING (post_id) 
JOIN 
    posts_likes PL2 ON (PL2.post_id = P.post_id AND PL2.user_id = :user_id) 
JOIN 
    post_participants PC USING (post_id) 
JOIN 
    post_participants PC2 ON (PC2.post_id = P.post_id AND PC2.user_id = :user_id) 
JOIN 
    post_participants PC3 ON (PC3.post_id = P.post_id AND is_winner = 1) 
INNER JOIN 
    users U USING (user_id) 
LEFT JOIN 
    lot_times LT USING (time_id) 
LEFT JOIN 
    lot_categories LC USING (category_id) 
WHERE 
    P.user_id NOT IN (:list) AND P.post_type = 'lot' 
ORDER BY 
    participants, likes, comments DESC 
LIMIT 0, 20 
+0

私はこのクエリで多くの情報を取得しているため、これを行うことはできません。私はorjinalにSQLクエリを更新しました。 –

+0

このクエリは本当に大きいので、サブクエリは間違いなく時間がかかります。ここでは直接結合を使用する必要があります。 私は自分のコメントを更新しています。 –

+0

さて、私はsytnaxエラーを与えたので、このクエリを更新しました。しかし、これは動作していない、私に0結果を与える:( –