我需要查询两列“oc_filter_group_description.name”和“oc_filter.name”并获得所有匹配的结果。
别名似乎引起了我的问题。我尝试过使用子查询,但作为一个完整的新手,我真的不知道自己在做什么
这是代码。 OR条款是需要适应的
SELECT *,(SELECT name FROM oc_filter_group_description fgd
WHERE f.filter_group_id = fgd.filter_group_id) AS `group`
FROM oc_filter f LEFT JOIN oc_filter_description fd ON (f.filter_id = fd.filter_id)
WHERE fd.name LIKE '% **QUERY GOES HERE** %'
OR 'group' LIKE '% **QUERY GOES HERE** %'
我花了很长时间试图让这个工作起来我认为我最好再次强制执行。
提前致谢
答案 0 :(得分:3)
您无法引用select
子句中where
中定义的列别名。这是您的查询:
SELECT *,
(SELECT name
FROM oc_filter_group_description fgd
WHERE f.filter_group_id = fgd.filter_group_id
) AS `group`
FROM oc_filter f LEFT JOIN
oc_filter_description fd
ON f.filter_id = fd.filter_id
WHERE fd.name LIKE '% **QUERY GOES HERE** %' OR
'group' LIKE '% **QUERY GOES HERE** %';
它有两个明显的问题。第一个是'group'
是一个字符串常量而不是列引用。 仅使用单引号作为字符串文字。它避免了这种类型的问题。第二个是它引用group
子句中定义的select
。
最佳解决方案是将select
中的子查询替换为另一个join
:
SELECT *, fgd.name as group_name
FROM oc_filter f LEFT JOIN
oc_filter_description fd
ON f.filter_id = fd.filter_id LEFT JOIN
oc_filter_group_description fgd
ON f.filter_group_id = fgd.filter_group_id
WHERE fd.name LIKE '% **QUERY GOES HERE** %' OR
fgd.name LIKE '% **QUERY GOES HERE** %';
请注意,我还将名称group
更改为group_name
,因此它不会与MySQL保留字冲突。 Voila,不需要引号。
答案 1 :(得分:0)
这可能看起来很小,但你不应该使用反引号,并尽可能避免使用关键字:
SELECT *, (
SELECT name FROM oc_filter_group_description fgd
WHERE f.filter_group_id = fgd.filter_group_id) AS T_GROUP
FROM oc_filter f LEFT JOIN oc_filter_description fd ON (f.filter_id = fd.filter_id)
WHERE fd.name LIKE '% **QUERY GOES HERE** %'
OR T_GROUP LIKE '% **QUERY GOES HERE** %'
希望这会有所帮助。
答案 2 :(得分:0)
你做得比必要复杂得多。所有你需要的是这样的:
select just the fields you need
from oc_filter f LEFT JOIN oc_filter_description fd ON (f.filter_id = fd.filter_id)
and (fd.name like '%static text goes here, not a query%'
or `group` like '%static text goes here, not a query%')
请注意,过滤器现在是连接的一部分,而不是where子句。如果它们在where子句中,则左连接将有效地成为内连接。