2017-10-23 3 views
2

によって順:注文、私はビューで私のデータベース順序から*選択して、4によって制限クエリ持っている別の列

SELECT * FROM articles WHERE visible = 1 ORDER BY views LIMIT 4; 

をしかし、同じクエリで、私は他のすべての行を見つけたいです更新された列による注文。

私はこのようなtryiedものをhavedが、作品はありません:

(SELECT * FROM articles ORDER BY views DESC LIMIT 4) 
UNION 
(SELECT * FROM articles ORDER BY updated_at DESC); 

これは時間によって注文後、4件のhotestホームページの記事やが更新された「ピン留め」されている提案します。

行を繰り返さずに同じクエリで複数の方法でORDER BYを行う方法はありますか?

どうすればいいですか?

+0

あなたは一番ホットな4番目を最初のリストにしますか?ホームページに表示される記事はいくつですか?合うよりも多くの記事がある場合は、どれくらいですか? (もっと正確になるように質問を編集してください。それでは、ティムズよりも良い答えを提供するかもしれません) –

答えて

-1

... UNIONのデフォルト動作では、重複する行は結果から削除されているということです。 ...

そして

ORDER BYがSELECTにLIMITなしで表示された場合、それはとにかく効果がありませんので...、それが離れて最適化されています。 ...

だからここにトリックは(それが限度を選択するのはあなた次第です)2番目のクエリでlimitを使用することです:

(SELECT * FROM articles WHERE visible = 1 ORDER BY views DESC LIMIT 4) 
UNION 
(SELECT * FROM articles WHERE visible = 1 ORDER BY updated_at DESC LIMIT 100); 

クエリはMySQLの5.6及び5.7で試験しました。

+0

これは本当に完璧に機能しました!洞察のおかげで、私は問題を解決するために手伝った! – char4

+0

このクエリの問題は、順序付けがないことです。最初の4つの最大のビューが結果セットの最初に現れるという保証はありません。 –

+0

@TimBiegeleisenあなたの声明に関するさらなる証拠を提供してください。 – zstate

0

複数のコマンドをカンマで区切って複数のコマンドを区切ることができます。 MySQLは左から右の順番で並んでいます。あなたの現在の考え方を続ける

SELECT * FROM articles WHERE visible = 1 ORDER BY views, updated_at DESC LIMIT 4;

+0

しかし結果は4で制限されませんか? 'views'で4つの最もホットな記事を見つけて、' updated_at'ですべての残りの行を探したいと思います。 – char4

2

、我々は2つのサブクエリの和集合を取ることができます。最初のサブクエリはあなたの質問に既に含まれているもので、頻繁に閲覧される4つの記事を見つけます。 2番目のサブクエリはそれ以外のものをすべて検索します。ここでのトリックは、各サブクエリに、他のすべてのレコードから上位4つのレコードを追跡するために使用できる計算フィールドを含めることです。次に、この計算されたフィールドで最初に順序付けられ、次に2番目にupdated_atフィールドが続きます。 MySQLのdocumentationから

(
    SELECT a.*, 1 AS label 
    FROM articles a 
    WHERE visible = 1 
    ORDER BY views DESC 
    LIMIT 4 
) 
UNION ALL 
(
    SELECT a.*, 2 
    FROM articles a 
    WHERE visible = 1 
    ORDER BY views DESC 
    LIMIT 1000000 OFFSET 4 -- the limit 1000000 is arbitrary; just use a number 
)        -- larger than the expected size of your table 
ORDER BY 
    label, views, updated_at 
+0

「ORDER BY views DESC」にする必要があります。なぜなら、@ char4は「最もホットな」記事を望んでいるからです。 –

+0

@RaymondNijlandそうです...あなたはOPからクエリを無意識のうちにコピーしています。 –

+0

@TimBiegeleisenありがとう、あなたは私をたくさん助けています。 OFFSETの前にカンマを削除してクエリを実行しようとしました。今私は構文エラーがあった: '(...)構文を使用して '1 AS label FROM articles'を表示するWHERE visible = 1 ORDER BY views DESC at line 2' – char4

関連する問題