#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 Я попытался сделать это, добавив его к вопросу.