2017-08-31 56 views
1

我有一个表alertsMySQL的联盟就同一个表有两个WHERE子句

date | alert | status | sentDate | id 

在这个表,我发出警报后,我的状态设置为“sent”并设定发送日期。默认状态是'not'(这意味着它尚未发送)。

现在,我想最后sentDate,我可以使用下面的查询

SELECT sentDate FROM alerts WHERE id = someid AND status = 'sent' Order by date desc limit 1; 

而且得到这个,我想这还未发送最新的警报,我使用此查询

SELECT date, alert FROM alerts WHERE id = someid AND status = 'not' order by date asc limit 1; 

是否可以在一个查询中执行此操作?也许使用UNION。我试图在这两个查询上应用UNION/UNION ALL,但它给了我错误。

任何人都可以请帮忙吗?

在此先感谢。

+0

你需要有相同数量的列使用UNION。 –

+0

为什么id会是'id'?!?! – Strawberry

+0

查询的列在两个查询中必须相同。 –

回答

1
SELECT 
max(CASE WHEN status = 'sent' THEN DATE END) AS sentDate, 
max(CASE WHEN status = 'not' THEN DATE END) AS notSentDate 
FROM alerts WHERE id = someid 

你可以试试上面的查询。

它会帮助你。

-1

列数必须在查询一样,试试这个:

SELECT sentDate,'' FROM alerts WHERE id = 'id' AND status = 'sent' Order by date desc limit 1; 

UNION 

SELECT date, alert FROM alerts WHERE id = 'id' AND status = 'not' order by date asc limit 1; 

此外,我认为是无关的,该信息由sentDate的存在给出。

我想你可以写:

SELECT sentDate,'' FROM alerts WHERE id = 'id' AND sentDate is not null Order by date desc limit 1; 

    UNION 

    SELECT date, alert FROM alerts WHERE id = 'id' AND sentDate is NULL order by date asc limit 1; 
1

你可以试试这个:

SELECT MAX(t.sentDate) AS sentDate, MAX(t.date) AS date, MAX(alert) AS alert 
FROM 
(
    SELECT MAX(sentDate) AS sentDate, "" AS date, "" AS alert 
    FROM alerts 
    WHERE id = someid 
    AND status = 'sent' 

    UNION 

    SELECT "" AS sentDate, date, alert 
    FROM alerts 
    WHERE id = someid 
    AND status = 'not' 
) t 
0

你可以试试这个一个

SELECT 
    (Select date from alerts where id= someid AND status='not' 
ORDER by date DESC limit 1) latestNotSentDate, 
    (Select date from alerts where id= someid AND status='sent' 
ORDER BY date DESC limit 1) latestSentDate;