Составные запросы mysql COUNT с несколькими условиями И ИЛИ

#mysql

#mysql

Вопрос:

Следующий запрос mysql предназначен для ОБЪЕДИНЕНИЯ множества таблиц вместе и выполнения подсчетов для каждой из этих таблиц в соответствии с временем данной таблицы.

 SELECT 
   COUNT(DISTINCT s.id) AS textcnt,
   COUNT(DISTINCT f.id) AS favcnt
                    FROM stream_updates s 
                        LEFT JOIN favorites f
                    ON f.username=s.username                        
                        INNER JOIN members m
                    ON m.username=s.username 
                    WHERE (m.username = 'testuser1'
                    AND (m.username IN (
                           SELECT friend2 as username FROM list_friends 
                           WHERE (friend1 = 'testuser1' AND friend2 <> 'testuser1') 
                    )) OR (m.username IN (
                           SELECT friend1 as username FROM list_friends
                           WHERE (friend2 = 'testuser1' AND friend1 <> 'testuser1')
                    ))) AND (s.time between (NOW() - INTERVAL 1 DAY) AND NOW()
                    OR (f.time between (NOW() - INTERVAL 1 DAY) AND NOW()))
  

По какой-то причине приведенное выше ЗНАЧЕНИЕ ВСЕГДА возвращает ноль.

Вот пример запроса: http://sqlfiddle.com /#!9/a88f1e/1

Запрос из примера ДОЛЖЕН возвращать:

 textcnt: 2 // id's 1 and 4 from the stream_updates table
favcnt: 1 // id 1 from the favorites table
  

Вместо этого он возвращает 0 для обоих значений

Пожалуйста, поймите, если вы собираетесь предложить переписать запросы, что я на самом деле считаю 5 таблиц с ЛЕВЫМИ соединениями, я просто урезал это для простоты.

У меня также возникают трудности с правильным написанием предложения WHERE. Необходимо проверить, существует ли пользователь в таблице members, и если да, выполнить запрос к пользователю. Затем необходимо проверить, находится ли пользователь в таблице list_friends, и если да, то далее выполнить запрос для друзей пользователя. Я обеспокоен тем, как я это написал, он проверит, чтобы убедиться, что оба имеют место. Однако, если я изменю его с AND на OR, у меня возникнет проблема, когда, если пользователь находится в таблице members , запрос не будет выполнять OR .

ОБНОВЛЕНИЕ ДЛЯ УТОЧНЕНИЯ ПРЕДЛОЖЕНИЯ WHERE

Я пытаюсь сделать следующее в предложении where:

Сначала получите все подсчеты члена ‘testuser1’

Во-вторых, если у testuser1 есть друзья, перечисленные в list_friends, включите их результаты также в подсчеты.

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

ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ, у меня также есть другие запросы, в которых я получаю данные за последние 48 часов, вычитая последние 24 часа (таким образом, результаты получены 2 дня назад, но не сегодня)… и это продолжается, поэтому, пожалуйста, не переписывайте таким образом, чтобы он захватывал «последние 24 часа», потому что тогда я применяю в другом месте, он захватит «Последние 48 часов», а не «24 часа с 2 дней назад».

Комментарии:

1. sqlfiddle, плюс 1

2. У вас есть невозможное предложение where, которое никогда не вернет никаких записей, следовательно, 0, возвращаемое запросами. Если я просто использую предложение where, вы ищете запись, где m.username = ‘testuser1’ и (m.username<>’testuser1 или m.username<>’testuser1). Не могли бы вы, пожалуйста, описать на простом английском языке, что должны делать критерии where?

3. @Shadow Я попытался сделать это, добавив его к вопросу.