2016-04-15 8 views
1

で始まるので、私はUNIONUNIONのSQLクエリをリライトする方法、それはSELECT

なし
(SELECT entry_id, url_title, channel_id, entry_date, title 
FROM exp_channel_titles 
WHERE exp_channel_titles.channel_id = 5 
    AND status = 'open' 
ORDER BY entry_date asc 
LIMIT 2) 
UNION 
(SELECT entry_id, url_title, channel_id, entry_date, title 
FROM exp_channel_titles 
WHERE exp_channel_titles.channel_id = 6 
    AND status = 'open' 
    AND entry_date > ((unix_timestamp(Now()))+(2*86400)) 
ORDER BY entry_date asc LIMIT 1) 
UNION 
    (SELECT entry_id, url_title, channel_id, entry_date, title 
    FROM exp_channel_titles 
    WHERE exp_channel_titles.channel_id = 5 
    AND status = 'open' 
    ORDER BY entry_date asc LIMIT 1,2) 
    LIMIT 3; 

を記述する必要がこのSQLはだから何それがないことは、その後でイベントを選択2件のニュース記事であることを迷惑な問題を持っています将来の「ストーリー」は、イベントストーリーがなければ別のニュースストーリーを追加します。

したがって、2つのカテゴリがありますが、1つは異なる選択肢を持つため、重み付けされているので、常に3つありますが、可能な場合はイベントです。

私は、ジョインでこれを行う方法や、ブラケットを使わない方が簡単な方法を考える必要があります。私がロードする場所には、UNIONが好きではありません。

+1

これは、関連するテーブル(作成とデータ)のSQLエクスポートを使用して、人々があなたの手助けをすることができるようにすることができます。 – Jester

+0

今すぐブラケットは必要ありません。 – RiggsFolly

+0

'SELECT * FROM ..) '? – trincot

答えて

0

答えは、余分なSELECTと各サブクエリ

SELECT * FROM ( 
    SELECT * FROM (SELECT entry_id, url_title, channel_id, entry_date, title 
     FROM exp_channel_titles 
     WHERE channel_id = 5 
     AND status = 'open' 
     ORDER BY entry_date asc LIMIT 2) 
    AS news 
UNION 
    SELECT * FROM (SELECT entry_id, url_title, channel_id, entry_date, title 
     FROM exp_channel_titles 
     WHERE channel_id = 6 
     AND status = 'open' 
     AND entry_date > ((unix_timestamp(Now()))+(2*86400)) 
     ORDER BY entry_date asc LIMIT 1) 
    AS gallery 
UNION 
    SELECT * FROM (SELECT entry_id, url_title, channel_id, entry_date, title 
     FROM exp_channel_titles 
     WHERE channel_id = 5 
     AND status = 'open' 
     ORDER BY entry_date asc LIMIT 1,2) 
    AS more_news 
) AS articles LIMIT 3; 

へのエイリアスとして必要あなたがラップしたときに(MySQLのようだ)SELECTで*今では異なるので、それぞれ(それらを結合する必要があります)今すぐに必要SELECT * FROM()ASエイリアスです。これはビットオーバーキルですが、すべてのcolを使用できるようにしたいので意味があります。

これは多くの手順であるため、私はまだ軽い解決策を望んでいますが、それはうまく動作します。

+0

@Luis Siquotとtrincotのおかげで – tristanbailey

1

これは正しい構文は次のとおりです。フラグは、特定のレコードがから来て、最終的なレコードで知っているよう

select * from (SELECT entry_id, url_title, channel_id, entry_date, title, 1 as comesFrom 
FROM exp_channel_titles 
WHERE exp_channel_titles.channel_id = 5 
    AND status = 'open' 
ORDER BY entry_date asc 
LIMIT 2) AS part1 
UNION 
select * from (SELECT entry_id, url_title, channel_id, entry_date, title, 2 as comesFrom 
FROM exp_channel_titles 
WHERE exp_channel_titles.channel_id = 6 
    AND status = 'open' 
    AND entry_date > ((unix_timestamp(Now()))+(2*86400)) 
ORDER BY entry_date asc LIMIT 1) as part2 
UNION 
select * from (SELECT entry_id, url_title, channel_id, entry_date, title, 3 as comesFrom 
    FROM exp_channel_titles 
    WHERE exp_channel_titles.channel_id = 5 
    AND status = 'open' 
    ORDER BY entry_date asc LIMIT 1,2) as part3 
-- may be you want an order by here also 
LIMIT 3; 

私もcomesFromフィールドを追加しました。場合によっては便利です。最後に

+0

申し訳ありませんが、私は詳細を説明するための十分な英語力はありません –

+0

ありがとう、私はその考えが大好きです。それを考えなかった。午前中に試してみる。それを選択して動作させます。 – tristanbailey

+0

それは正しい方向でしたが、MySQLは各サブ(サブ)に対して余分なSELECTとASエイリアスを必要としました – tristanbailey

関連する問題