我有一个代表书店之类的数据库。有一个包含书籍所属类别的表。某些类别仅使用另一个包含类别-项目关系的表来定义。但也有一些类别可以通过编程方式定义——可以使用查询(SELECT item_id FROM items WHERE author = "John Smith")定义特定作者的类别。所以我的类别表有一个“查询”列;如果它不为空,我使用它来获取类别中的项目,否则我使用 category_items 表。
目前,我让应用程序(PHP 代码)做出此决定,但这意味着当我们遍历所有类别时需要进行大量单独的查询。有什么方法可以将此动态 SQL 合并到连接中吗?像这样的东西:
SELECT c.category, IF(c.query IS NULL, count(i.items), count(EXECUTE c.query)
FROM categories c
LEFT OUTER JOIN category_items i
ON c.category = i.category
EXECUTE 需要准备好的语句,但我需要为每一行准备不同的语句。另外,EXECUTE 不能用在表达式中,它只是一个顶层语句。有什么建议吗?
最佳答案
当您想按出版商列出图书时会发生什么?国家?语?您必须将它们全部放入一个“category_items”表中。您将如何选择要执行的动态查询?查询中查询方法不会起作用。
我觉得你的“类”概念太宽泛了,导致SQL过于复杂。我会替换“类别”以仅代表“流派”(对于书籍)。流派在它们自己的表中定义,item_genres 将它们连接到 items 表。 Books-by-author 和 books-by-genre 应该只是应用程序级别的单独查询,而不是尝试在数据库/SQL 级别使用相同(某种)查询来执行它们。 (如果您有音乐和书籍,它们可能不应该全部存储在一个“项目”表中,因为它们是不同的概念……有不同的流派、作者与艺术家等)
我知道这并不能真正按照您希望的方式解决您的问题,但我认为您不尝试那样做会更开心。
关于mysql - 每行动态sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11441538/