【问题标题】:MySQL using column values in queryMySQL 在查询中使用列值
【发布时间】:2018-11-10 16:25:26
【问题描述】:
+-------------+----------+-----------+
| animal_name | tag_name | tag_group |
+-------------+----------+-----------+
| CatBlue     | cat      | species   |
| CatBlue     | blue     | colour    |
| DogBlue     | dog      | species   |
| DogBlue     | blue     | colour    |
| DogRed      | dog      | species   |
| DogRed      | red      | colour    |
+-------------+----------+-----------+

上面的表格是各种连接表格的简化视图。

它是根据所选标签返回结果的系统的一部分。问题是如果选择了 blue 和 cat 标签,系统当前也会返回 DogBlue。 (在 SQL 中使用 OR)

在 MySQL 中,如何仅搜索所有标签组中具有一个或多个标签的动物?是否可以在查询中使用 tag_group 列值?

编辑: 我希望能够请求动物具有颜色 blue 和物种 cat 的表格行。 WHERE tag_name = cat OR tag_name = blue 也会带出狗。

【问题讨论】:

  • 以格式化数据而非图像的形式提供带有示例数据的表结构。并以格式化文本的形式提供预期的输出。

标签: mysql


【解决方案1】:

要获得拥有所有这些属性的animal_name,您可以使用条件聚合,例如

SELECT animal_name
FROM table1
GROUP BY animal_name
HAVING SUM(CASE WHEN tag_name = 'cat' AND tag_group = 'species' THEN 1 ELSE 0 END  ) > 0
AND SUM(CASE WHEN tag_name = 'blue' AND tag_group = 'colour' THEN 1 ELSE 0 END  ) > 0
;

使用 Mysql 你也可以使用sum(a=b), SUM(tag_name = 'blue' AND tag_group = 'colour') 作为简写,在sum() 中使用表达式会得到一个布尔值 0/1, true/false

Demo

For Blue dog

SELECT animal_name
FROM table1
GROUP BY animal_name
HAVING SUM(CASE WHEN tag_name = 'dog' AND tag_group = 'species' THEN 1 ELSE 0 END  ) > 0
AND SUM(CASE WHEN tag_name = 'blue' AND tag_group = 'colour' THEN 1 ELSE 0 END  ) > 0
;

根据最后的评论 我需要蓝猫和蓝狗 添加OR 条件以同时拥有两个动物名称

SELECT animal_name
FROM table1
GROUP BY animal_name
HAVING (
  SUM(CASE WHEN tag_name = 'dog' AND tag_group = 'species' THEN 1 ELSE 0 END  ) > 0
  AND 
  SUM(CASE WHEN tag_name = 'blue' AND tag_group = 'colour' THEN 1 ELSE 0 END  ) > 0
) OR (
  SUM(CASE WHEN tag_name = 'cat' AND tag_group = 'species' THEN 1 ELSE 0 END  ) > 0
  AND
  SUM(CASE WHEN tag_name = 'blue' AND tag_group = 'colour' THEN 1 ELSE 0 END  ) > 0
)

Demo

【讨论】:

  • 嗨,我如何将蓝狗添加到请求中?我玩过您的演示,但无法解决。
  • 谢谢,但对于我的例子,我需要蓝猫和蓝狗。在实际的应用程序中,有很多条目,但我想让事情保持简单,这样我就可以学习如何做到这一点。
  • @xgarb 我已根据您的最后评论更新了我的答案
  • 太棒了..它正在工作。我的应用程序实际上使用了 Doctrine,但我想先尝试在 MySQL 中理解它。我在我的代码中使用了类似的东西(循环通过一组分组标签):$queryBuilder->andHaving("SUM(CASE WHEN tt.name IN ('".$inString."') AND tg.group_name = '".$key."' THEN 1 ELSE 0 END ) > 0"); 感谢您的帮助。我永远无法解决这个问题。
【解决方案2】:

您可以根据您的条件使用子请求:

SELECT * FROM Table 
INNER JOIN (
SELECT animal_name, sum(tag_name = 'blue' OR tag_name = 'cat') as sum_condition
FROM TABLE
GROUP BY animal_name
HAVING sum_condition = 2) datas USING(animal_name)

编辑回复评论

SELECT * FROM Table 
INNER JOIN (
SELECT animal_name, sum(tag_name = 'blue' OR (tag_name IN ('cat','dog'))) as sum_condition
FROM TABLE
GROUP BY animal_name
HAVING sum_condition = 2) datas USING(animal_name)

编辑:我的错误是我忘记了一个括号 http://sqlfiddle.com/#!9/e9e941/15/0

【讨论】:

  • 嗨,我如何将蓝狗添加到请求中?
猜你喜欢
  • 2021-08-24
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2012-11-09
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多