2017-08-30 6 views
0

私は町のポータルシステムを開発しましたが、特定のselect文をあきらめました。Mysqlがelseとorder by文で選択

SELECT `id` FROM `test` ORDER BY FIND_IN_SET(`townid`,'townA'), date DESC LIMIT 3 ; 

CREATE TABLE `test` (
    `id` int(5) NOT NULL AUTO_INCREMENT, 
    `townid` varchar(10) NOT NULL, 
    `data` text NOT NULL, 
    `date` date NOT NULL DEFAULT '2017-08-30' 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `test` (`id`, `townid`, `data`, `date`) VALUES 
(1, 'townB', 'Data for Town B', '2017-08-29'), 
(2, 'townA', 'Data for Town A', '2017-08-28'), 
(3, 'townA', 'Data for Town A', '2017-08-27'), 
(4, 'townA', 'Data for Town A', '2017-08-26'), 
(5, 'townC', 'Data for Town C', '2017-08-25'), 
(6, 'townB', 'Data for Town B', '2017-08-24'); 

ALTER TABLE `test` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `test` 
    MODIFY `id` int(5) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;COMMIT; 

目的は、ID 5を選択townC ID 1,6および2

  • を選択townB ID 2、3及び4
  • を選択townA

    • ことである1,2

    言い換えれば、町は、自分のOWN記事を、最初に日付3の順に選択し、ELSEは、1つの制限3を選択するか、任意の他の町。

    どちらtownid =「townB」またはWHERE townid IN(「townB」)はタウンBのための唯一の1 2のエントリ

  • +0

    でも卒業はない、多くの卒業生が、私がやったことを達成することができます言ったが、正式な訓練なしで私が唯一の私は自分自身のことを学んだか知っていると私はドン「非常に簡単」なものの多くは、最も可能性があります知っている。 (私は決して諦めずに検索して検索し、解決策が見つかるまで試してみる...) –

    +1

    自分自身のように、障害の可能性がある障害に答えることはできませんが、ここにいる少数の人々は、正式な訓練を受けています。 – Strawberry

    +0

    本当のライブで尋ねる人は誰もいません - それは私の障害です。オンラインで簡単なのですが、自分でやっていることを信じている限り、決してそうしません。 (私が書いたコードのいくつかはおそらく20倍の難しさですが....) –

    答えて

    1

    はあなたがあっても、私は3つの結果を必要とする3リミット問題に対処することができます選択提供されたサンプルとクエリでほぼ完璧でした。あなたが変更する必要があるのは、find-in-set節による順序をDESCENDINGにすることだけです。

    ORDER BY FIND_IN_SET(townid,'townA') DESC, date DESC 
    

    find_in_set()は、見つかったもの(1)または見つからない(0)に基づいて1または0を返します。だからあなたは最初に見つけられなかったものによって注文しています。あなたはその逆を望む。だから、もしあなたが99のアイテムを持っていて、数日の間に各町A、B、Cに均等に分かれていたら、FIND_IN_SETに "DESC"それ以降の誰でも次に、FOUND(またはNOT)レコードの各セット内で降順にソートします。

    あなたのクエリは実際には「DESC」節だけ離れています。 「正式な訓練なし

    +0

    2つのDESC句離れて動作します。 http://rextester.com/RBXBQL81555を検索し、find in setの1,0の分析にスポットを当てます。 – xQbert

    +0

    ワウありがとうございました。私は何度も何時間も座って座っていましたが、私はそれがほしいと思っていますが、これは私の方が優れています(実際には私が知っている限りどこにも存在しないシステムを構築します。それと$ 1は、まだhehehe) –

    +0

    ダムニット。私はシステム全体を検索して置き換え、 "開発"サイト以外のすべてを変更したので、実際にDESCが含まれていることがわかった理由を確認しましたが、ライブタウンポータルにとってDESCを「重要ではない」として破棄しました。 –

    0
    SELECT * 
        FROM test 
    ORDER 
        BY townid = 'townc' DESC -- or 'towna' or 'townb' 
        , date DESC 
    LIMIT 3; 
    
    +4

    このコードスニペットをありがとう、すぐに役立つかもしれません。適切な説明は、なぜ*これが問題の良い解決策であるかを示すことによってその教育上の価値を大幅に改善し(// meta.stackexchange.com/q/114762)、将来の同様の、しかし、同一ではない質問。説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –