1

私は次のmysqlクエリを持っています:

SELECT merchantNames.strippedName,merchantNames.lastCached,merchantNames.id
FROM merchantNames 
JOIN autoCoupons  
ON merchantNames.rawName = autoCoupons.merchantName
WHERE NOW() > autoCoupons.startDate AND autoCoupons.startDate > merchantNames.lastCached
OR NOW() > autoCoupons.endDate AND autoCoupons.endDate > merchantNames.lastCached
OR NOW() > autoCoupons.timeAdded AND autoCoupons.timeAdded > merchantNames.lastCached
OR merchantNames.lastCached < NOW() - INTERVAL 2 DAY
GROUP BY merchantNames.strippedName
ORDER BY merchantNames.pageviews DESC

WHERE句の基準の最初の3行を満たすものが上になり、下の行だけを満たすものが下になるように結果を並べ替えるには、このクエリを設定するにはどうすればよいですか?

4

2 に答える 2

3

クエリを2つに分割し、UNIONを使用して結果を結合します。

于 2012-09-22T17:30:04.387 に答える
1

このクエリに必要な結果を取得する方法は他にもありますが、「カスタムORDER BY」の場合は、ブール句の結果で並べ替えることができます。DESCtrue(1)の結果を最初に配置し、false(0)の結果を2番目に配置します。あなたの場合、ネストされた(以下の)クエリを使用してこのクエリを読み書きするのが最も簡単SELECTですが、もちろん、ORDER BYの明示的な条件を使用してより長いクエリを作成することもできます。これにより、大幅に高速化できます。

SELECT r.strippedName, r.lastCached, r.id
FROM
    (SELECT
        merchantNames.strippedName,
        merchantNames.lastCached,
        merchantNames.id,
        merchantNames.pageviews,
        (NOW() > autoCoupons.startDate AND autoCoupons.startDate > merchantNames.lastCached) AS a,
        (NOW() > autoCoupons.endDate AND autoCoupons.endDate > merchantNames.lastCached) AS b,
        (NOW() > autoCoupons.timeAdded AND autoCoupons.timeAdded > merchantNames.lastCached) AS c,
        (merchantNames.lastCached < NOW() - INTERVAL 2 DAY) AS d
    FROM merchantNames 
    JOIN autoCoupons ON merchantNames.rawName = autoCoupons.merchantName
    GROUP BY merchantNames.strippedName) AS r
WHERE r.a OR r.b OR r.c OR r.d
ORDER BY (r.a OR r.b OR r.c) DESC, pageviews DESC
于 2012-09-22T17:36:00.703 に答える