Mysql 括号中的Select不为空
我不太确定如何做到这一点:Mysql 括号中的Select不为空,mysql,Mysql,我不太确定如何做到这一点: SELECT contacts.first_name, contacts.last_name, ( SELECT quotes.id FROM quotes LEFT JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id WHERE quotes.id IS NOT NULL
SELECT contacts.first_name,
contacts.last_name,
(
SELECT quotes.id
FROM quotes
LEFT JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
WHERE quotes.id IS NOT NULL
AND quotes_contacts.contact_id = contacts.id
ORDER BY quotes.date_entered
LIMIT 1
) AS 'first_quote'
FROM
contacts
但是,作为第一个引号返回的一些值将作为null返回。如何停止该操作?对子查询使用内部联接,而不是子选择。这将消除空值
SELECT contacts.first_name,
contacts.last_name,
quote_id AS first_quote
FROM
contacts
INNER JOIN (
SELECT quotes.id, quotes_contacts.contact_id
FROM
quotes
LEFT JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
JOIN (
SELECT quotes_contacts.contact_id, MIN(quotes.date_entered) AS date_entered
FROM
quotes
JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
GROUP BY contact_id
) minquote ON quotes.date_entered = minquote.date_entered AND qc.contact_id = minquote.contact_id
) firstquote ON contacts.id = firstquote.contact_id
如果您确定quote.id在递增,并且每个联系人的最低quote.id_id也输入了最早的日期,那么这会更简单。在这种情况下,您只需执行一个MINquote.id
如果subselect找到一行并且id的值为null,那么WHERE子句将阻止返回该行。但是,每当subselect根本找不到任何内容时,first_quote的值仍将为null。一个额外的外部防护应该可以做到这一点:
SELECT contacts.first_name,
contacts.last_name,
(
SELECT quotes.id
FROM quotes
LEFT JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
WHERE quotes.id IS NOT NULL
AND quotes_contacts.contact_id = contacts.id
ORDER BY quotes.date_entered
LIMIT 1
) AS 'first_quote'
FROM contacts
WHERE first_quote IS NOT NULL
但是这里的连接比子选择更有效。这听起来正是我需要的。虽然我得到了:1064-您的SQL语法有一个错误;查看与您的MySQL服务器版本相对应的手册,了解使用“联系人内部连接选择引号”中的“作为第一个引号”的正确语法。id,contact_id F',在contacts.last_name之后,在第1行missing处,上面编辑了两个其他别名更改,并从内部ON子句中删除了一个不必要的组件…它可以工作,但它只返回与联系人关联的所有引号。有一个id为8a3b3aff的联系人,因为他有5个引号,所以出现了5次。我只需要该用户创建的第一个报价。@andy子查询中是否还有order by和limit?自行运行子查询并验证每个contactHmm是否得到一个引号。我尝试过这种方法,但它在“where子句”中生成1054-未知列“first_quote”
SELECT contacts.first_name,
contacts.last_name,
(
SELECT quotes.id
FROM quotes
LEFT JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
WHERE quotes.id IS NOT NULL
AND quotes_contacts.contact_id = contacts.id
ORDER BY quotes.date_entered
LIMIT 1
) AS 'first_quote'
FROM contacts
WHERE first_quote IS NOT NULL