Условный фильтр для запроса MySQL - PullRequest
0 голосов
/ 12 февраля 2010

У меня есть запрос, который выглядит так:

select a.title, is.filename
  from articles a
  join article_images ai on ai.article_id = a.article_id
  join images i on i.image_id = ai.image_id
  join image_sizes is on is.image_id = i.image_id
 where is.size_name = '96x96';

Таким образом, между статьями и изображениями существует отношение N: N, а между изображениями и размерами изображений - соотношение N: 1. Это выбирает изображение 96x96 для каждой статьи.

Теперь я хочу изменить это так, чтобы он выбирал изображение 96x96, , если , то article_id равно 42, и в этом случае он выбирает другой размер. Есть ли способ сделать это в одном запросе?

Ответы [ 3 ]

4 голосов
/ 12 февраля 2010

Изменить на это:

where (a.article_id <> 42 AND is.size_name = '96x96')
   OR (a.article_id = 42 AND is.size_name = 'something different')
1 голос
/ 12 февраля 2010
(select a.title, is.filename
  from articles a
  join article_images ai on ai.article_id = a.article_id
  join images i on i.image_id = ai.image_id
  join image_sizes is on is.image_id = i.image_id
 where is.size_name = '96x96' and a.article_id <> 42)
union all
(select a.title, is.filename
  from articles a
  join article_images ai on ai.article_id = a.article_id
  join images i on i.image_id = ai.image_id
  join image_sizes is on is.image_id = i.image_id
 where is.size_name = 'Some other size' and a.article_id = 42)

Вам нужно будет заменить «некоторый другой размер» на любой другой размер или использовать SELECT TOP 1 и GROUP BY во втором запросе, если вы не знаете размер.

1 голос
/ 12 февраля 2010

Я думаю, вы должны разделить свой запрос на два запроса: запрос для 96x96 и запрос для article_id = 42.Тогда вы должны объединить эти два результата.Это также поможет вам поддерживать чистоту и удобство чтения ваших запросов.

...