Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 括号中的Select不为空_Mysql - Fatal编程技术网

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