да, BOOLEAN это синоним для TINYINT(1). Но в CREATE TABLE можно прямо писать BOOLEAN и MySQL это скушает. Главная мысль — это сделать это поле NOT NULL, чтобы были только 1 и 0 значения, потому что по логике NULL (значение отсутствует) не может быть у поля «является ли главным изображением», а может быть только true (1) и false (0)
По вопросу оптимальности — обычно оптимальней будет left join. Но тут просто приджойнить табличку, насколько я вижу, не получится — т.е. уже под джойном будет запрос с подзапросом. А это уже хуже, чем просто один подзапрос. Ну, насколько я это понимаю. Плюс еще такое замечание — если у вас картинок меньше 10к, то вообще не стоит заморачиваться на производительности и выбрать самый легко читаемый (а поэтому и легко поддерживаемый) запрос.
Плюс еще, если я правильно понимаю структуру вашей БД, я бы сделал galleryBody.imgMain типа BOOLEAN NOT NULL — тогда будет 1 и 0, а не 1 и NULL, что будет немного логичнее.
Простого способа решить эту задачу нету — полюбому придется как-то изворачиваться. Расскажите, что нужно сделать в общем (вместо с джойном) — может быть подскажем тут.
Немного подумав, так тоже будет работать, но избавляемся от ненужного запроса:
SELECT * FROM test t1
WHERE t1.is_main = 1
OR NOT EXISTS(
SELECT * FROM test t2 WHERE t2.parent_id = t1.parent_id AND t2.is_main IS NOT NULL
)
GROUP BY t1.parent_id
Не забудьте его отключить только после того, как проведете замеры все необходимые. По моим наблюдениям само наличие xdebug раза в 3 увеличивает время генерации страницы.
поздапрос в этом случае не будет ли выполняться для каждой строки в my_table? Уж лучше тогда отдельным запросом получить MAX(pk_column), а потом в where уже константу записать.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.