我有一个包含foo_name
列和foo_type
foo_type
的值可以为A
,B
或C
我想查找表中没有foo_name
且foo_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_name
和foo_name
的所有foo_type = A
(答案:栏)
答案 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