2013-11-12 2 views
0
  • В каждом альбоме много значков.
  • Значок является текущим, если его поле current <> 0
  • Альбом является текущим, если каждый из его значков является текущим.

мне нужно знать: Для каждого альбома, в настоящее время альбом?Подзапрос mySQL, чтобы узнать, есть ли

Я пробовал:

"SELECT *, ".$subquery." AS current FROM tbl_album" 

где $subquery является:

SELECT EXISTS(SELECT 1 FROM tbl_icon2album JOIN tbl_album ON tbl_album.id=tbl_icon2album.albumID WHERE tbl_icon2album.b_current_in_timeproof = 0) 

Но это не работает. Я получаю сообщение «1064 У вас возникла ошибка в синтаксисе SQL«

Интересно, что подзапрос отлично работает как автономный. Кроме того, основной запрос отлично работает следующим образом:

SELECT *, 1 AS current FROM tbl_album 

Таким образом, если подзапрос работает, а основной запрос работает, почему они не будут работать вместе?

Постскриптум: Работающий решение этой проблемы было представлено в this question.

+0

Что делать, если альбом имеет 0 иконки? Разве это сейчас? – troelskn

+0

, потому что 'SELECT *, SELECT EXISTS (...) FROM ...' далек от правильного синтаксиса, если вы писали все это в одном фрагменте, я думаю, вы бы с большей вероятностью это увидели. – OGHaza

+0

Действительно, синтаксическая ошибка заключалась в том, что мне нужны скобки вокруг подзапроса. Однако правильный результат дал решение Майкла Андерсона –

ответ

2

Вам не нужно подзапрос здесь, попробуйте следующее:

SELECT a.albumId, 
     IF(SUM(IF(i.current<>1,1,0)) = 0,'Current','Not Current') as IsCurrent 
FROM tbl_album a 
LEFT JOIN tbl_icon2album i ON i.albumId = a.albumId 
GROUP BY a.albumId 

Обновленный запрос, чтобы отразить, если альбом тока на основе суммы значков текущих состояний.

Обновлено: изменена i.current <> 0 в i.current <> 1

+0

Не уверен, что это работает. Мне нужно подтвердить КАЖДОЙ значок альбома, а не значок ONE. Тем не менее, я считаю, что моя ошибка в том, что мне нужны дополнительные круглые скобки вокруг подзапроса ... –

+0

Да, как только я опубликовал его, я увидел проблему. Я просто обновился. В основном суммируйте все состояния значков - если они текущие, он считается 0, если он не считается равным 1. Если общая сумма равна> 0, тогда у альбома есть значок, который не является текущим, и, следовательно, альбом не является текущим. –

+0

Спасибо, сэр. Это работает! Теперь я понимаю, что этот запрос может работать быстрее с помощью EXISTS. Это верно? –

0

Так что я беру несколько предположений здесь, как вы не предоставили структуру таблиц. Вы пытаетесь выбрать все альбомы, и состояние, если они «ток» или нет, где «ток» определяется как их, имеющие один или несколько значков, которые ток:

SELECT 
    IF(
     tbl_icon2album.current != 0, 
     "current", 
     "not current" 
    ) AS isAlbumCurrent, 
    tbl_album.* 
FROM tbl_album 
LEFT JOIN tbl_icon2album ON 
    tbl_album.id=tbl_icon2album.albumID 
GROUP BY tbl_album.id; 
+0

Если к одному альбому прикреплено пять значков, вы не оценивая текущий статус каждого значка с этим запросом. Вы будете оценивать только один, поскольку вы не используете агрегированную функцию для свертывания статусов. –

+0

Что говорит Майкл Андерсон. Я тестировал это, и он не дает правильного результата. –

+0

Вы правы. Я читал вопрос как «если одна иконка текущая», а не «если все ** значки ** текущие». Ваше решение верно. Upvoted. На самом деле я даже не проверяю, есть ли это, только первый ... Все неприятности здесь, двигайтесь вперед. – boodle

Смежные вопросы