我正在尝试将一条“简化”的SQL查询转换成可用于XnViews数据库的SQLite查询,这意味着数据库布局对我试图做的事情来说至少是次优的,并且我无法改变任何东西。
例如:"(cat_10 and cat_12) and (cat_5 or cat_7)"。
这应该针对表"t3"使用,该表具有字段"if"(文件ID)和"ic"(类别ID)。
记录看起来像这样:
简化后的查询应该只选择文件9和10,因为文件7虽然有所需的类别10和12,但没有5或7。
实际问题现在是构建可怕的查询语句,因为我已经花了几个小时才让两个类别之间的AND工作。
这个语句给出了所有包含类别10和12的文件ID,但我不知道如何将其与剩余的“并且(cat_5或cat_7)”组合起来。
当我计划这些简化的SQL语句时(通过HTML和JS构建的单击生成器),我打算将“cat_5”替换为“t3.ic = 5”,并保留其余部分。
当然,我没有预料到它不起作用,因为WHERE检查整个条目,ic = 5 AND ic = 7不能同时存在。这几乎破坏了一切。
所以我想知道是否有人知道如何将这些简单的查询转换为实际工作的查询,同时记住它可能不仅限于(x和y)对。
编辑:我已经解决了我给出的示例,至少我认为是这样:
例如:"(cat_10 and cat_12) and (cat_5 or cat_7)"。
这应该针对表"t3"使用,该表具有字段"if"(文件ID)和"ic"(类别ID)。
记录看起来像这样:
if, ic
7, 10
7, 12
7, 4
9, 10
9, 12
9, 5
10, 10
10, 12
10, 7
简化后的查询应该只选择文件9和10,因为文件7虽然有所需的类别10和12,但没有5或7。
实际问题现在是构建可怕的查询语句,因为我已经花了几个小时才让两个类别之间的AND工作。
SELECT if FROM t3 WHERE ic IN (10, 12) GROUP BY if HAVING count(if) = 2
这个语句给出了所有包含类别10和12的文件ID,但我不知道如何将其与剩余的“并且(cat_5或cat_7)”组合起来。
当我计划这些简化的SQL语句时(通过HTML和JS构建的单击生成器),我打算将“cat_5”替换为“t3.ic = 5”,并保留其余部分。
当然,我没有预料到它不起作用,因为WHERE检查整个条目,ic = 5 AND ic = 7不能同时存在。这几乎破坏了一切。
所以我想知道是否有人知道如何将这些简单的查询转换为实际工作的查询,同时记住它可能不仅限于(x和y)对。
编辑:我已经解决了我给出的示例,至少我认为是这样:
SELECT if FROM t3 WHERE ic IN (10, 12) GROUP BY if HAVING count(if) = 2
INTERSECT
SELECT if FROM t3 WHERE ic IN (5, 7) GROUP BY if
但现在的主要问题是以正确的顺序解决括号内的内容。
编辑2:我想试着用group_concat()将类别分组到一个字段中,然后我应该能够简单地使用cats LIKE“ ”来将它们组合成小块,然后只需添加括号就可以了。强调一下“应该”。
SELECT if FROM t3 WHERE ic IN (10, 12) GROUP BY if HAVING count(if) = 2 INTERSECT SELECT if FROM t3 WHERE ic IN (5, 7)
现在我正在尝试弄清楚如果我能正确解析()的顺序,哪个更容易使用。我还考虑稍微改变简单语法,通过执行([AND | OR] cat_1 cat_2 cat_3)来将()限制为AND或OR,但是()的解析问题仍然存在。 - BloodyRain2k