0

嗨,我正在 mysql 中执行嵌套的“选择”查询。查询是

SELECT `btitle` FROM `backlog` WHERE `bid` in (SELECT  `abacklog_id`  FROM `asprint` WHERE `aid`=184 )

通过上述查询,我​​没有得到预期的答案。如果我执行:

abacklog_idasprint哪里选择 aid=184

分别地

我将获得 abacklog_id 为42,43,44,45

所以如果我再次执行:

SELECT `btitle` FROM `backlog` WHERE `bid` in(42,43,44,45)

我会得到btitle scrum1 scrum2 scrum3 msoffice

但是,如果我结合这些查询,我只会得到scrum1剩下的 3 个atitle不会得到。

4

2 回答 2

0

您可以尝试如下...

SELECT `age_backlog`.`ab_title` FROM `age_backlog` LEFT JOIN `age_sprint` ON `age_backlog`.`ab_id` = `age_sprint`.`as_backlog_id` WHERE `age_sprint`.`as_id` = 184

通过使用此查询,您将获得带有 loop 的结果。您将能够通过使用 IMPLODE 函数以逗号分隔的相同位置获得所有结果。

希望对您有所帮助...如果您有任何错误,请告诉我...

于 2013-05-16T12:34:51.823 回答
0

您所做的是将逗号分隔的值存储在 中age_sprint.as_backlog_id,对吗?

您的查询实际上变成

SELECT `ab_title` FROM `age_backlog` WHERE `ab_id` IN ('42,43,44,45')

注意函数'中的IN()。你没有得到单独的数字,你得到一个字符串。

现在,当你这样做时

SELECT CAST('42,43,44,45' AS SIGNED) 

这基本上是 MySQL 所做的隐式转换,结果是42. 这就是为什么你会得到scrum1结果。

您可以在 SO 上搜索此问题的数十个答案。

您永远不应该将逗号分隔的值存储在数据库中。它违反了第一范式。在大多数情况下,数据库是第三范式或 BCNF 甚至更高。较低的范式仅在某些特殊情况下使用以获得最佳性能,通常用于报告问题。不适用于实际处理数据。您希望每个 1 行as_backlog_id

同样,您的主要目标应该是获得更好的数据库设计,而不是编写一些疯狂的函数来将每个逗号分隔的数字排除在外。

于 2013-05-16T13:46:31.313 回答