2016-04-15 33 views
1

我有一个恼人的问题是,这条SQL我需要在不UNION如何重写一个UNION 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; 

写开始那么它的作用是选择2的新闻报道,然后在事件未来的“故事”,那么如果没有事件故事添加另一个新闻故事。

所以两个类别,但一个有不同的选择,所以加权总是有3但如果可能的事件。

我需要考虑一种方法来做到这一点与连接,或开始没有()括号,使其更简单。我加载的地方不喜欢UNION。

+1

你可以提供使用相关表(创建和数据)的sql导出,这样人们可以帮助你更容易地工作 – Jester

+0

你现在不需要括号 – RiggsFolly

+0

用'SELECT * FROM(...)包装整个东西。 ..)'? – trincot

回答

0

最终的答案需要额外的SELECT和AS别名每个子查询

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()作为别名,这有点矫枉过正,但是因为它想让所有cols可用,所以很有意义。

我仍然想要一个更轻的解决方案,因为这是很多步骤,但它工作,对我很好。

+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

相关问题