1

私は2つのテーブルを持っています。

Table 1.
========
id
post
--------

Table 2.
========
id
post_id
thumbs_sum
--------

クエリは次のようになります。

SELECT DISTINCT(t2.id), t2.sum, t1.id
FROM table1 t
    LEFT JOIN table2 t2 ON t2.post_id = t1.id
ORDER BY t2.sum DESC

たとえば、5 つの投稿があります (合計 - 高評価と低評価の合計):

1. sum = 3
2. sum = 1
3. sum = 5
4. sum = null
5. sum = -2

投稿番号 4 には表 2 にレコードがありません。そのため、クエリは次を返します。

1. sum = 5
2. sum = 3
3. sum = 1
4. sum = -2
5. sum = null

データベーステーブルの構造を変更できず、PHP で結果をソートできない場合、この問題を解決するにはどうすればよいですか?

4

4 に答える 4

3

select distinct は、データの量によっては、戻ってくるまでに時間がかかる場合があります。たとえば、可能な場合は「group by t2.id」を使用することをお勧めします。結果は同じになりますが、より高速になります。パフォーマンスを向上させるために、テーブルのインデックス作成も検討してください。

あなたの質問に答えて、私は使用します

order by ifnull(t2.sum, 0) DESC

あなたの他のオプションは、これが決して問題にならないように、データベーステーブルの設計でゼロのデフォルト値を設定することです;)

于 2012-06-15T09:53:48.810 に答える
3

ここでの実際の質問は何かを理解しようとしています。「この問題の決め方」はちょっと難解です。

とにかく、ここでの問題はnull、投票のない投稿の親指の合計として値があることだと思います。それらを注文するとき、おそらくヌルをゼロに置き換えたいと思うでしょう。

SELECT DISTINCT(t2.id), t2.sum, t1.id
FROM table1 t
    LEFT JOIN table2 t2 ON t2.post_id = t1.id
ORDER BY IFNULL(t2.sum, 0) DESC
于 2012-06-15T09:43:22.857 に答える
3

NULL順序付けで値を 0 として変換する場合は、次のORDER BYように句を拡張する必要があります。

ORDER BY IFNULL(t2.sum, 0) DESC

この方法では、MySQL が使用可能なインデックスを使用できないことに注意してください。そのため、何千ものレコードを注文すると時間がかかる場合があります。

于 2012-06-15T09:43:06.560 に答える
2

COALESCEを使用しないのはなぜですか?

SELECT DISTINCT(t2.id), COALESCE(t2.sum, 0), t1.id
FROM table1 t
    LEFT JOIN table2 t2 ON t2.post_id = t1.id
ORDER BY t2.sum DESC

その関数は最初の非 null 値を取得します。

于 2012-06-15T09:53:03.943 に答える