多个表OR子句和别名

时间:2014-02-06 12:58:01

标签: mysql sql opencart

我需要查询两列“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** %'

我花了很长时间试图让这个工作起来我认为我最好再次强制执行。
提前致谢

3 个答案:

答案 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子句中,则左连接将有效地成为内连接。