Возврат данных первой таблицы независимо от того, возвращает ли вторая таблица данные, нормализация соединения оператора - PullRequest
0 голосов
/ 16 января 2012

У меня есть две таблицы MySQL, 'section' и 'pages'.

Я пытаюсь использовать один запрос для извлечения данных из одной или обеих таблиц.

Еслираздел и страница существуют, оператор AND работает нормально.

Если раздел и страница не существуют, то оператор AND также подходит.

Однако я не могу найти способ вытащитьиз таблицы разделов, если страница не существует (проблема оператора AND) в сочетании с URL-адресами index.php (извлекает все страницы index.php для сайта).

Я пытаюсь написать более качественные запросы, чтобыВот мои цели и то, что я пытался:

Я не хочу тянуть все страницы, которые соответствуют разделу, а затем повторять их.

Я не хочу тратить ресурсы на выполнениевторой запрос, если это можно сделать в одном запросе.

В настоящее время у меня есть два, если условные запросы (только один будет выполняться для данной загрузки страницы), поскольку страницы с URL-адресом «index.php» будут извлекать всеразделы.

Я использовалFROM в сочетании с таблицей разделов, хотя я также пытался использовать 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

section : id, section_id, meta_description, meta_language, meta_robots, title, url

Самое главное, я хочу убедиться, что синтаксис нейтрален к SQL, так как я планирую со временем перейти с MySQL на PostgreSQL.

1 Ответ

2 голосов
/ 16 января 2012

В основном догадываюсь, так как я не уверен, что точно вы хотите достичь, но попробуйте это:

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'
...