Я запрашиваю две таблицы с помощью запроса JOIN, чтобы определить, каждая ли строка в столбце approved результирующего набора равна TRUE.

SELECT
    `approvals`.`approved`
FROM `sign_ins`
RIGHT JOIN `approvals` ON
    `sign_ins`.`user` = `approvals`.`user`;

Это вернет результирующий набор логических значений для каждого пользователя, например.

1
0
0
1
1

Мой PHP-код просматривает эти строки и определяет, все ли они одобрены, просто возвращая false и прерывая цикл, если любое из этих значений равно 0. Однако я думаю, что было бы более производительно и оптимально, если бы не было необходимости в повторении набора результатов; в конце концов, меня действительно волнует только одно: TRUE, если значение всех строк approved равно TRUE; иначе, FALSE.

Могу ли я сделать это с помощью запроса MySQL?

Спасибо.

5
M Miller 3 Ноя 2014 в 02:26

3 ответа

Лучший ответ

Вот мое решение. Я использую функцию MIN для выбора наименьшего значения, поэтому она должна возвращать 0, если присутствуют какие-либо значения FALSE. Кроме того, поскольку это не полное соединение, вход в систему, отсутствующий в таблице approvals, следует считать неутвержденным; поэтому я использовал IFNULL для предоставления значения по умолчанию FALSE.

Вот полный пример моего запроса (без некоторой логики даты):

SELECT
    MIN(IFNULL(`approvals`.`approved`, FALSE))
FROM `sign_ins`
LEFT JOIN `approvals` ON
    `sign_ins`.`user` = `approvals`.`user`;
1
M Miller 3 Ноя 2014 в 03:21

Если вы просто хотите получить все ИСТИННЫЕ результаты, попросите их!

SELECT
    `approvals`.`approved`
FROM `sign_ins`
RIGHT JOIN `approvals` ON
    `sign_ins`.`user` = `approvals`.`user`;
WHERE `approvals`.`approved` = 1
2
kair 3 Ноя 2014 в 02:30
1
Мой вопрос: как узнать, верны ли все строки? Я не хочу просто выбирать истинные.
 – 
M Miller
3 Ноя 2014 в 02:36

Я бы просто COUNT() все строки сравнил с SUM() утвержденного столбца. Если они совпадают, то все строки равны 1. Если нет, то был хотя бы один 0.

Использование COUNT(approved) не будет считать значения NULL, поэтому вам не нужно это компенсировать.

Ваш запрос будет выглядеть так:

SELECT (CASE WHEN COUNT(approved)=SUM(approved) THEN 1 ELSE 0 END)
FROM sign_ins
RIGHT JOIN approvals USING (user)

Это должно вернуть 1 для ИСТИНА и 0 для ЛОЖЬ.

4
wolfgangwalther 3 Ноя 2014 в 03:32