无论第二个表是否返回数据,运算符连接规范化都返回第一个表数据

时间:2012-01-15 23:01:42

标签: mysql normalization

我有两个MySQL表,'sections'和'pages'。

我正在尝试使用单个查询来从一个或两个表中获取数据。

如果部分和页面存在,则AND运算符正常工作。

如果部分和页面不存在,那么AND运算符也可以。

但是,如果页面不存在(AND运算符问题)和index.php urls(拉取站点的所有index.php页面),我似乎无法找到从section表中提取的方法。 / p>

我正在尝试编写更好的查询,所以这是我的目标和我尝试的内容:

我不想拉出与该部分匹配的所有页面,然后迭代它们。

如果可以在单个查询中完成,我不想在执行第二个查询时浪费资源。

我目前有两个if条件查询(只有一个将针对给定的页面加载执行),因为带有'index.php'URL的页面将为所有部分提取。

我已经将FROM与sections表结合使用了,虽然我也在页面表上尝试了LEFT JOIN。

这适用于非索引的页面:

(SELECT NULL AS meta_description FROM sections WHERE url = 'example')
UNION
(SELECT meta_description FROM pages WHERE url = 'something');

该查询最多返回两行,并且很容易使用。


部分和页面存在,返回结果:

SELECT * 
FROM sections AS cs 
LEFT JOIN pages AS cp ON (cp.id_section = cs.id) 
WHERE cs.section_url LIKE BINARY 'section_url' AND cp.url LIKE BINARY 'index.php'

部分存在,页面不存在,返回0行......

SELECT * 
FROM sections AS cs 
LEFT JOIN pages AS cp ON (cp.id_section = cs.id) 
WHERE cs.section_url LIKE BINARY 'section_url' AND cp.url LIKE BINARY 'not_exist'

表格结构:

网页:id,section_id,meta_description,meta_language,meta_robots,title,url

部分:id,section_id,meta_description,meta_language,meta_robots,title,url

最重要的是,我希望确保语法是SQL中性的,因为我计划最终从MySQL迁移到PostgreSQL。

1 个答案:

答案 0 :(得分:2)

主要猜测,因为我不确定你想要实现的完全,但试试这个:

SELECT * 
FROM sections AS cs 
LEFT JOIN pages AS cp ON (cp.id_section = cs.id AND cp.url LIKE BINARY 'not exists') 
WHERE cs.section_url LIKE BINARY 'section_url'