Выбор ровно одного элемента из каждого условия предложения WHERE - PullRequest
0 голосов
/ 15 августа 2011

Это мой текущий запрос:

SELECT 
  topic.title, 
  topic.content_id, 
  topic.thumbnail_icon, 
  text.description 
FROM 
  mps_contents AS topic, 
  mps_contents AS text 
WHERE 
  topic.featured = '1' AND 
  topic.active = '1' AND 
  topic.page_id = (SELECT page_id 
                     FROM mps_pages 
                    WHERE page_short_name = 'services' 
                       OR page_short_name = 'questions_faqs') AND 
  text.section_id = (SELECT section_id 
                       FROM mps_sections 
                      WHERE section_short_name = 'page_text') AND 
  text.page_id = topic.content_id AND 
  topic.resource_type = 'subpage' AND 
  text.resource_type = 'text' 
ORDER BY RAND() LIMIT 2

EDIT:
Это MySQL

Что я действительно хочу сделать, так это выбрать 1 рекомендуемый элемент из services и 1 рекомендуемый элемент из questions. Тем не менее, этот запрос выберет 2 элемента из services или questions!

Я знаю, что один из вариантов - сделать UNION и выполнить LIMIT 1 для обоих запросов UNION, но это означало бы, что мне придется дублировать 90% запроса. Могу ли я сделать это, не прибегая к UNION s?

1 Ответ

0 голосов
/ 15 августа 2011

хорошо, я полагаю, что если вы не перепроектируете / нормализуете таблицу, вы всегда будете в какой-то степени повторять запрос.

Если все, что вы хотите избежать объединения, вы можете переписать

  topic.page_id = (SELECT page_id 
                 FROM mps_pages 
                WHERE page_short_name = 'services' 
                   OR page_short_name = 'questions_faqs')

до

topic.page_id = (SELECT page_id 
                 FROM mps_pages 
                 WHERE page_short_name = 'services' ORDER BY RAND() LIMIT 1)
                   OR 
topic.page_id = (SELECT page_id 
                 FROM mps_pages 
                 WHERE page_short_name = 'questions_faqs' ORDER BY RAND() LIMIT 1)

Я не думаю, что будет слишком большой прирост производительности, хотя rand () будет выполняться дважды

...