我有两个遵循这种格式的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.pagetitle
或mod_site_content.content
中找到一个字符串,但如果不存在,也请搜索mod_site_tmplvar_contentvalues.value
,但仅限于tmplvarid
为2或3的位置。< / p>
目前,我最接近的是以下查询:
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知识非常有限。
答案 0 :(得分:2)
您可以尝试运行以下代码:
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)