2017-02-13 44 views
1

我不知道如何更好地命名或说出这些,这会导致我的搜索出现偏差。子查询中出现条件问题

我有这个声明,它的工作原理。

SELECT username 
    , ip 
    FROM database.users 
WHERE ip = (SELECT ip 
       FROM database.users_chat_history 
       WHERE username = ? 
       limit 1); 

但是,我需要这样的事情,这是不允许的:

SELECT username 
    , ip 
    FROM database.users 
WHERE ip = (SELECT ip 
        , posted_at 
       FROM database.users_chat_history 
       WHERE username = ? 
       group 
       by posted_at desc 
       limit 1); 

Error: ER_OPERAND_COLUMNS: Operand should contain 1 column(s)

原因是是我需要它这样做搜索时抢最新/最近期的行,并与第一个,这不是这样做,这是造成问题。第二个查询,我只需要该语句的ip工作,但我需要它通过posted_at降序分组,因此它抓住了最新的职位。

编辑: 为内部查询数据库样本: enter image description here

+4

你没有使用聚合函数..所以你为什么在select中使用group by?尝试解释你的目标是什么。最终用适当的数据样本更新你的问题和预期的结果 – scaisEdge

+1

order by posting_at desc将给你最新的记录 –

+0

更新了样本,但有人回答了它在下面的工作。 –

回答

1

我想你应该有顺序重新 “分组依据” BY子句。请看下图:

SELECT username, ip FROM database.users WHERE ip = (SELECT ip FROM database.users_chat_history WHERE username = ? ORDER BY posted_at desc limit 1); 
+0

谢谢,这回答了。 –

+0

很高兴帮助。 – Amila

1

我愿意为子查询做这样的事情:

SELECT ip FROM database.users_chat_history WHERE username = ? ORDER BY posted_at ASC LIMIT 1; 

未经检验,但应返回IP只(一列),而仅有一条记录(ASC适应/ DESC)相应到你要找的东西

+0

这也适用(显然,是相同的代码),只是不完整的完整查询,这就是为什么我选择了其他答案作为解决我的问题的一个,只是在某些人在未来的搜索和出现这个。感谢您的帮助,我很感激! –