根据其他列值从表中选择一列

时间:2015-03-30 07:25:23

标签: mysql sql

我在MySql中有一个表,表名是日志

+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| domain        | varchar(50)   | YES  | MUL | NULL    |       |
| sid           | varchar(100)  | YES  | MUL | NULL    |       |
| email         | varchar(100)  | YES  | MUL | NULL    |       |
+---------------+---------------+------+-----+---------+-------+

以下是表格中的示例行

+------------+----------------+---------------
| sid        | email                 | domain|
+------------------------------------+-------+
| 1 |        | xxx123@yahoo.com      | xxx   |
| 2 |        | xxx123@yahoo.com      | xxx   |
| 2 |        | yyy123@yahoo.com      | yyy   |
| 2 |        | yyy123@yahoo.com      | yyy   |
| 3 |        | zzz123@yahoo.com      | zzz   |
| 4 |        | qqq123@yahoo.com      | qqq   |
| 2 |        | ppp123@yahoo.com      | ppp   |
+---+--------+-----------------------+-------+

我想要一个类似

的查询
select * from logs
where sid IN (select sid from logs
              where domain="xxx" AND email="xxx123@yahoo.com")

期望的输出

+------------+-----------------------+--------
| sid        | email                 | domain|
+------------------------------------+-------+
| 1 |        | xxx123@yahoo.com      | xxx   |
| 2 |        | xxx123@yahoo.com      | xxx   |
| 2 |        | yyy123@yahoo.com      | yyy   |
| 2 |        | yyy123@yahoo.com      | yyy   |
| 2 |        | ppp123@yahoo.com      | ppp   |
+---+--------+-----------------------+-------+

我可以使用连接来实现,但有没有办法在不使用连接或此查询的任何优化版本的情况下获得结果

4 个答案:

答案 0 :(得分:0)

首先在这些行上获取正确的ID。你第二次尝试过吗?它看起来应该有效。我不知道你为什么要那样。

如果它实际上不起作用尝试这种结构,可能会更快:

SELECT *
FROM some_table
WHERE relevant_field IN
(
    SELECT * FROM
    (
        SELECT relevant_field
        FROM some_table
        WHERE conditions
    ) AS subquery
)

答案 1 :(得分:0)

您可以将where exists用作

select l1.* from logs l1 
where exists( 
   select 1 from logs l2 
   where l1.sid = l2.sid 
   and l2.domain = 'xxx' 
   and l2.email = 'xxx123@yahoo.com'
);

答案 2 :(得分:-1)

您想要将整个表作为结果还是只需一列?

如果我的问题得到解决,我会很简单地使用:

SELECT * FROM logs WHERE domain="xxx" AND email="xxx123@yahoo.com"

或者如果你只想要sid,只需用sid替换*即可。 如果所有sid都是数字,为什么不使用int或类似列类型的东西?

答案 3 :(得分:-1)

通过查看您似乎寻找的请求,您似乎正在做一些多余的事情

select * from logs where domain="xxx" AND email="xxx123@yahoo.com"

我不知道你为什么要使用SQL字符串的第一部分,因为这不是来自其他sql表的连接。

或者我错过了什么?

相关问题