2013-04-04 5 views
5

Я хочу условно переключиться, если все строки пустые для столбца audio. Я попытался с типом GROUP BY, но не работает.MySQL: проверьте весь столбец, если какая-либо строка имеет значение

SELECT postid, title, has_audio, audio, type 
    FROM qa_posts 
    WHERE parentid=1 

enter image description here

Так что, если аудио существуют для всего столбца для этого родительского идентификатора, что выполнение кода А если не чем код B

ответ

6

Вы можете просто count все строки, для которых audio не является NULL. Но если ваш стол больше и содержит множество строк и т. Д., То реальная проблема с этим подходом заключается в том, что такой запрос может быть дорогим для БД и, по крайней мере, медленнее, чем это могло бы быть. Конечно, преждевременная оптимизация плохая вещь, но это не так - мы будем оптимизировать подход, а не код :)

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

Во-первых, было бы хорошо подумать, вопрос are all rows' audio column empty? это действительно правильный. И нет. Это не так: на самом деле вам не нужно знать how many of rows are not null или are all rows' audio column empty?, потому что это полностью неуместно для вашего состояния, если есть 5, 10 или 100000. Что вы должны сделать, так это «перевернуть» вопрос и найти ответ на вопрос, например, if there's any row that is NOT null?. И даже оба вопроса выглядят одинаково с первого взгляда, мы используем базу данных, чтобы получить ответ, так что на самом деле это весь игровой чейнджер.

По логике, чтобы ответить на этот вопрос if there's any row that is NOT null? это просто достаточно, чтобы выяснить, существует ли по крайней мере один ряд с audio быть NOT NULL. «По крайней мере» вещь позволяет нам применить некоторые ограничения к запросу, потому что 1 прекрасно выполняет «по крайней мере одно» условие, мы будем использовать SQL LIMIT 1, что сделает остановку БД и вернет результат, как только он найдет первую запись, соответствующую запрос, без необходимости проходить через всю таблицу. Это просто должно быть быстрее и менее ресурсоемким.

После выполнения наш запрос может вернуть два результата. Либо мы ничего не получаем (возвращаются нулевые строки), а это означает, что все audio составляют NULL или, как противоположность, мы получаем что-то (одна строка, не имеет значения, какая), что будет означать ответ на вопрос if there's any row that is NOT null?: «да, это is '(потому что, по крайней мере, тот, который был возвращен).

+0

Но в этом изображении только три строки, которые могут быть 10 или 15 или больше .. что в таком случае? Я просто хочу проверить, доступно ли какое-либо звуковое поле для родительского идентификатора. Если какое-либо одно поле не имеет значения null, оно должно возвращать значение true. любое предложение? – Artist

+0

Просто сузить выбранные результаты до строк, разделяющих ваш родительский идентификатор с 'WHERE parentid = 1' –

+0

WebnetMobile совершенно прав. Лучший ответ, чем мой. Лучше всего следить за минимизацией нагрузки на сервер, даже с такими маленькими вещами, чтобы вы привыкли к этому. –

2

Сделайте запрос с select count(*) по телефону WHERE audio != null. Затем сделайте условное утверждение исходя из числа, которое вы получите. Убедитесь, что звук проиндексирован.

+0

Это тоже хорошая идея .. вы имеете в виду, если count> 0, чем true .. правильно? – Artist

+0

это плохой подход - я сделал заметку в своем ответе, почему. –

+0

Я вижу, но я просто хочу проверить, что любое поле имеет значение или null только два условия, а не фактический счет. поэтому что-то вроде 'if (audio == 0) {ничего не делать} else {do ​​this}' – Artist

1

Вы можете просто проверить для NOT NULL строк как

SELECT * FROM `table` WHERE column IS NOT NULL AND column <> ''