我有两个遵循此格式的MySQL表:

       mod_site_content                  mod_site_tmplvar_contentvalues
-----------------------------    ---------------------------------------------
id | pagetitle | content         id | tmplvarid | contentid | value
-----------------------------    ---------------------------------------------
1  | Project 1 | <p> ... </p>    1  | 1         | 1         | 12.08.2014
2  | Project 2 | <p> ... </p>    2  | 1         | 2         | 13.08.2014
3  | Project 3 | <p> ... </p>    3  | 2         | 1         | <img src="..."/>
4  | Project 4 | <p> ... </p>    4  | 2         | 4         | <img src="..."/>
5  | Project 5 | <p> ... </p>    5  | 3         | 4         | [{"key":"val"...
6  | Project 6 | <p> ... </p>    6  | 3         | 5         | [{"key":"val"...


mod_site_content是代表网页的资源列表,并且mod_site_tmplvar_contentvalues是(可选)附加页面内容。



假设我想在mod_site_content.pagetitlemod_site_content.content中找到一个字符串,但是如果不存在,也搜索mod_site_tmplvar_contentvalues.value,但仅在tmplvarid是2或3的情况下。

当前,最接近的是以下查询:

SELECT * FROM mod_site_content
    INNER JOIN mod_site_tmplvar_contentvalues
        ON mod_site_content.id = mod_site_tmplvar_contentvalues.contentid
    WHERE
       tmplvarid = 2 OR
       tmplvarid = 3 AND
       pagetitle LIKE ? OR
       content LIKE ? OR
       value LIKE ?


但这会产生比预期更大的结果数组,其中看起来有很多重复项。

它还以意外的方式合并了两个表。例如如果Project 1不包含匹配项,但第二个表中的id 3包含匹配项,我想返回Project 1并将第二个表的结果推入数组。

我知道这个问题有点冗长,但是我想清楚一点,因为我的SQL知识非常有限。

最佳答案

您可以尝试运行以下代码:

SELECT * FROM mod_site_content
    INNER JOIN mod_site_tmplvar_contentvalues
        ON mod_site_content.id = mod_site_tmplvar_contentvalues.contentid
    WHERE tmplvarid IN (2,3) AND
    1= (CASE WHEN pagetitle LIKE ? OR content LIKE ? THEN 1
             WHEN value LIKE ? THEN 1
             ELSE 0 END)

关于mysql - 如果在第一个数据库表中找不到匹配项,则搜索第二个数据库表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25221479/

10-12 01:17