MySQL查找所有行,其中行的行数可能小于n

时间:2015-10-22 04:58:12

标签: mysql sql

我有一个包含foo_name列和foo_type

列的表格

foo_type的值可以为ABC

我想查找表中没有foo_namefoo_name的所有可能值的所有foo_type。换句话说,

DISTINCT(foo_name) WHERE COUNT(rows grouped by foo_name) for all foo_name is less than 3

样本数据

Foo, A
Foo, B
Foo, C
Bar, B
Bar, C
Baz, A
Qux, A
Qux, B
Qux, C

我的查询应该返回 Bar Baz ,因为那些foo_name不具有foo_type的所有可能值的行。< / p>

感谢执行上述操作的SQL的指针。

此外,我希望能够从count()扩展上述内容,以查找未找到某些值(或值)的foo_name的所有foo_type。在上面的示例数据中,我希望能够搜索未找到行匹配foo_namefoo_name的所有foo_type = A(答案:

3 个答案:

答案 0 :(得分:2)

可能有几种方法可以做到这一点,但我会用子查询来做。所以像这样......

SELECT foo_name 
FROM ( SELECT foo_name, COUNT(DISTINCT(foo_type)) AS foo_type_count 
       FROM foo_table
       GROUP BY foo_name ) as sq
WHERE foo_type_count != 3

子查询(括号内)返回所有foo_name值以及为每个值设置的foo_types的数量。然后根据一些其他标准选择一些foo_name值 - 在我提供的情况下,你可以拉出所有没有与它们相关的所有三个foo_types的foo_names。

如果你想调整它,你可以在子查询中添加WHERE子句,这样你就可以在子查询中做WHERE foo_type != A并更改子查询外的WHERE子句以匹配WHERE foo_type_count = 2 - 这会返回所有具有foo_types B和C的foo_names,无论是否有A.所以对于你的样本数据集,它应该返回Foo,Bar和Qux,而不是Baz。

答案 1 :(得分:2)

这是一个简单的聚合。您希望结果中每个foo_name有一行,因此您需要GROUP BY foo_name。然后将结果限制在HAVING:

var greeting = "something";
var word = new String("something");
greeting == word ----> True as their value is same
greeting === word -----> False because there value same but type is different .

您可以轻松更改HAVING子句,以了解为foo_name找到的类型,例如:

select foo_name
from my_table
group by foo_name
having count(distinct foo_type) < 3;

编辑:这与另一个可能更容易理解的HAVING子句相同:

select foo_name
from my_table
group by foo_name
having max(case when foo_type = 'A' then 1 else 0 end) = 0 -- A not found
   and max(case when foo_type = 'B' then 1 else 0 end) = 1 -- B found
   and max(case when foo_type = 'C' then 1 else 0 end) = 1 -- C found

答案 2 :(得分:0)

如果您不想手动输入数字@app.before_request def before_request(): g.user = flask.ext.login.current_user g.username = g.user.get_id() @app.route('/', methods=['GET', 'POST']) @flask.ext.login.login_required def index(): if g.user is None or not g.user.is_authenticated(): // or g.user.is_authenticated return redirect('login') return render_template('main.html', user=g.username) ,而是让数据库为您完成工作,您可以这样做:

3