我有一个像这样的值的表
listid email
1 test@email.com
5 test@eamil.com
1 test123@email.com
从上面的示例中,您可以看到同一封电子邮件可以显示在电子邮件列中,其中包含不同的listid
。
我想要返回listid
为1但不是listid
为5的电子邮件。在这种情况下,唯一返回的电子邮件是test123@email.com。
现在我有
SELECT `email`,`listid` FROM `table` WHERE `emailaddress` LIKE '%@email%' AND `listid` != 5 AND `listid`=1
当然这不起作用,因为test @ email的listid也是1。如何从结果中排除test @ email?
答案 0 :(得分:3)
您可以使用exists
运算符:
SELECT `email`,`listid`
FROM `table` t
WHERE `emailaddress` LIKE '%@email%' AND
`listid` = 1 AND
NOT EXISTS (SELECT *
FROM `table` t2
WHERE t1.`emailaddress` = t2.`emailaddress` AND
t2.`listid = 5)
答案 1 :(得分:1)
您可以使用加入:
maringanti-mbp:xpm smaringanti$ rake db:migrate
== AddAutoToProjectPerson: migrating =========================================
-- change_table(:project_people)
-> 0.0008s
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
divided by 0/Users/smaringanti/xpm/db/migrate/20150601054955_add_auto_to_project_person.rb:33:in `/'
/Users/smaringanti/xpm/db/migrate/20150601054955_add_auto_to_project_person.rb:33:in `calc_effort'
/Users/smaringanti/xpm/db/migrate/20150601054955_add_auto_to_project_person.rb:19:in `up'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:534:in `up'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:574:in `exec_migration'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:555:in `block (2 levels) in migrate'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:554:in `block in migrate'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:294:in `with_connection'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:553:in `migrate'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:709:in `migrate'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:959:in `block in execute_migration_in_transaction'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:1005:in `block in ddl_transaction'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `block in transaction'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in `within_new_transaction'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `transaction'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/transactions.rb:209:in `transaction'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:1005:in `ddl_transaction'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:958:in `execute_migration_in_transaction'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:920:in `block in migrate'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:916:in `each'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:916:in `migrate'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:764:in `up'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/migration.rb:742:in `migrate'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/gems/activerecord-4.0.2/lib/active_record/railties/databases.rake:42:in `block (2 levels) in <top (required)>'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/bin/ruby_executable_hooks:15:in `eval'
/Users/smaringanti/.rvm/gems/ruby-2.0.0-p643/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
答案 2 :(得分:1)
这是一种使用条件聚合的方法,通常速度很快。该查询选择listid
1或5的电子邮件,并使用条件聚合删除listid
5的电子邮件,并返回仅listid
1的电子邮件。
select email
from mytable t
where email LIKE '%@email%'
and listid in (1,5)
group by email
having sum(listid = 5) = 0
此查询可以利用listid