我可以根据 MySQL 中子查询的结果使用 WHERE 子句过滤我的结果吗?
Can I filter my results with a WHERE clause based on the result from a subquery in MySQL?
这是我当前的 mysql 查询。
SELECT t.id, t.customer, t.indicator_tag, t.indicator_manu, t.indicator_model, t.created_at, t.updated_at,
( SELECT status FROM events WHERE ticket_id = t.id ORDER BY created_at DESC LIMIT 1) AS status,
( SELECT CONCAT(firstName, ' ', lastName) FROM users WHERE id = t.created_by ) AS created_by,
( SELECT CONCAT(firstName, ' ', lastName) FROM users WHERE id = t.updated_by ) AS updated_by
FROM tickets t
WHERE status = 'Pending' OR status = 'Diagnosed' OR status = 'Repaired'
ORDER BY t.customer ASC, status ASC, t.indicator_tag ASC;
上面语句中的 WHERE 子句没有抛出任何错误,但它也没有过滤任何东西。我对 SQL 还是很陌生,所以我还没有深入研究 JOINS。我还应该注意,事件 table 每张票都有多个事件,第 2 行的子查询只会获取最新的事件。有没有一种方法可以根据来自另一个 table 的数据过滤结果,但同时只获取每张票的最新事件?
换句话说:
TABLE 门票有很多活动
活动属于门票
上面的示例将显示我得到的输出。请注意,它仅显示最新状态,而不是像在单个票证页面上那样显示所有事件。如果我能提供更多信息,我将很乐意提供帮助。
使用HAVING
:
SELECT t.id, t.customer, t.indicator_tag, t.indicator_manu, t.indicator_model, t.created_at, t.updated_at,
( SELECT status FROM events WHERE ticket_id = t.id ORDER BY created_at DESC LIMIT 1) AS status,
( SELECT CONCAT(firstName, ' ', lastName) FROM users WHERE id = t.created_by ) AS created_by,
( SELECT CONCAT(firstName, ' ', lastName) FROM users WHERE id = t.updated_by ) AS updated_by
FROM tickets t
HAVING status = 'Pending' OR status = 'Diagnosed' OR status = 'Repaired'
ORDER BY t.customer ASC, status ASC, t.indicator_tag ASC;
http://www.w3schools.com/sql/sql_having.asp
来自docs:
A HAVING clause can refer to any column or alias named in a select_expr in the SELECT list or in outer subqueries.
这是我当前的 mysql 查询。
SELECT t.id, t.customer, t.indicator_tag, t.indicator_manu, t.indicator_model, t.created_at, t.updated_at,
( SELECT status FROM events WHERE ticket_id = t.id ORDER BY created_at DESC LIMIT 1) AS status,
( SELECT CONCAT(firstName, ' ', lastName) FROM users WHERE id = t.created_by ) AS created_by,
( SELECT CONCAT(firstName, ' ', lastName) FROM users WHERE id = t.updated_by ) AS updated_by
FROM tickets t
WHERE status = 'Pending' OR status = 'Diagnosed' OR status = 'Repaired'
ORDER BY t.customer ASC, status ASC, t.indicator_tag ASC;
上面语句中的 WHERE 子句没有抛出任何错误,但它也没有过滤任何东西。我对 SQL 还是很陌生,所以我还没有深入研究 JOINS。我还应该注意,事件 table 每张票都有多个事件,第 2 行的子查询只会获取最新的事件。有没有一种方法可以根据来自另一个 table 的数据过滤结果,但同时只获取每张票的最新事件?
换句话说:
TABLE 门票有很多活动
活动属于门票
上面的示例将显示我得到的输出。请注意,它仅显示最新状态,而不是像在单个票证页面上那样显示所有事件。如果我能提供更多信息,我将很乐意提供帮助。
使用HAVING
:
SELECT t.id, t.customer, t.indicator_tag, t.indicator_manu, t.indicator_model, t.created_at, t.updated_at,
( SELECT status FROM events WHERE ticket_id = t.id ORDER BY created_at DESC LIMIT 1) AS status,
( SELECT CONCAT(firstName, ' ', lastName) FROM users WHERE id = t.created_by ) AS created_by,
( SELECT CONCAT(firstName, ' ', lastName) FROM users WHERE id = t.updated_by ) AS updated_by
FROM tickets t
HAVING status = 'Pending' OR status = 'Diagnosed' OR status = 'Repaired'
ORDER BY t.customer ASC, status ASC, t.indicator_tag ASC;
http://www.w3schools.com/sql/sql_having.asp
来自docs:
A HAVING clause can refer to any column or alias named in a select_expr in the SELECT list or in outer subqueries.