1

ほとんど同じである 2 つのかなり遅い SQL クエリを実行するスクリプトがあります。ページで「特集」されると思われるデータベース レコードから選択します。つまり、それらが最初に表示されます。もう 1 つはデータベースから通常のレコードを選択します。各クエリには約 0.3 秒かかりますが、両方が同時に実行されるため、0.6 秒を失います。したがって、これらのクエリを組み合わせることが可能かどうか疑問に思っていました。それらは次のようになります。

SELECT * FROM records WHERE [other where conditions] AND featured>=$timestamp ORDER BY featured DESC

SELECT * FROM records WHERE [other where conditions] AND featured<$timestamp ORDER BY created DESC

私がラベル付けした [その他の条件] は、どちらの場合も同じです。したがって、私が本質的に行う必要があるのは次のとおりです。

SELECT * FROM records WHERE [other where conditions] ORDER BY featured DESC UNLESS featured < $timestamp, created DESC

ただし、MySQL に「ORDER BY ... UNLESS」と伝える方法がわかりません。

4

4 に答える 4

2

order by単独でこれを行うことができます:

SELECT *
FROM records
WHERE [other where conditions]
ORDER BY (case when features >= $timestamp then featured else $timestamp end) DESC,
         created desc;
于 2013-09-05T19:53:52.783 に答える
1

これに使えますIF()

SELECT * FROM records
WHERE [other where conditions]
ORDER BY IF(featured >= $timestamp, featured, created) DESC
于 2013-09-05T19:52:56.413 に答える
1

はい、これを行うことができます。コードは次のようなものです。

SELECT * FROM records 
    WHERE [other where conditions] 
ORDER BY 
    IF(featured < $timestamp, created, featured) DESC

そしてphpバージョンは次のようになります:

$timestamp = now();
$SQLCond = "id = 4";
$SQLLimit = "LIMIT 0, 100";
$SQLMask = "SELECT * FROM records where " . $SQLCond . " ORDER BY IF(featured < " . mysql_real_escape_string($timestamp) . ", created, featured) DESC " . $SQLLimit;
于 2013-09-05T19:53:53.103 に答える
0

次のように、返された行に注目のフラグを作成するだけです。

SELECT CASE WHEN featured>=$timestamp THEN 1 ELSE 0 END AS `featuredRecord`, *
FROM records
WHERE [other where conditions]
ORDER BY featured DESC

最初のレコードは注目のレコードで、残りは通常のレコードです。

于 2013-09-05T19:53:48.080 に答える