Добрый день.
подскажите с запросом к d7.
нужно сделать вот такой блок, http://c2n.me/3Apy470.jpg
для этого, мне нужно получить по 4 публикации за последние 7 дней у которых есть публикации.
то есть, если за вчера нет 4 публикаций, дату пропускаем.
за готовое решение в формате db_select или db_query готов отблагодарить финансово.
спасибо
Комментарии
SELECT * FROM node WHERE FROM_UNIXTIME(created,'%Y%m%d') IN ( SELECT FROM_UNIXTIME(created,'%Y%m%d') FROM node WHERE created >= 1468479019 GROUP BY FROM_UNIXTIME(created,'%Y%m%d') HAVING COUNT(*) >= 4 )
$pDate = time() - 24*60*60*7;
$pLimit = 4;
$res = db_query("SELECT * FROM node WHERE FROM_UNIXTIME(created,'%Y%m%d') IN ( SELECT FROM_UNIXTIME(created,'%Y%m%d') FROM node WHERE created >= :created GROUP BY FROM_UNIXTIME(created,'%Y%m%d') HAVING COUNT(*) >= :limit )", array( ':created' => $pDate, ':limit' => $pLimit));
спасибо. только вместо 28 публикаци, запрос возвращает 113
Проверьте, будет ли 28 возвращать. В виде запроса для phpmyadmin:
SELECT * FROM node
INNER JOIN
(
SELECT FROM_UNIXTIME( created, '%Y%m%d' ) as day ,
SUBSTRING_INDEX(
GROUP_CONCAT( DISTINCT nid
ORDER BY created DESC
SEPARATOR ',' ), ',', 4 )
as nids
FROM node
WHERE FROM_UNIXTIME( created, '%Y%m%d' )
IN (
SELECT FROM_UNIXTIME( created, '%Y%m%d' )
FROM node
WHERE created >=1468479019
GROUP BY FROM_UNIXTIME( created, '%Y%m%d' )
HAVING COUNT( * ) >=4
)
GROUP BY FROM_UNIXTIME( created, '%Y%m%d' )
) AS dates
WHERE FIND_IN_SET(nid, dates.nids)
и получается не совсем то, он выводит с лимитом в неделю
а мне нужно за прошедшие 7 дней есть у них есть более 4 публикаций за день. то есть, если сегодня четверг и за прошлые выходные не было публикаций, 7 дней = начиная с прошлого вторника
Тут я предлагаю итерационно решать вопрос. В случае, если были пропуски в публикациях, увеличивать интервал
$pDaysLimit = 7
$pLimit = 4;
$pDays = $pDaysLimit;
1. Сделали запрос c параметром $pCreated = time() - $pDays *24*60*60
2. Возвратило записей не менее $pDaysLimit * $pLimit ?
2.1 Да, выводим, выход
2.2 Нет, $pDays++ и возвращаемся к п.1
я тоже думал про это, просто сделать рекурсивную функцию которая будет по дням шлепать назад и если кол-во публикаци не день меньше чего либо, вызывать снова саму себя пока не получится искомое количество позиций.
но подумал, возможно одним запросом это дело решить
спасибо за помощь
Последнюю попытку можно? Единственное, 7 не получилось в параметры вставить
$sql = "
SELECT * FROM node
INNER JOIN
(
SELECT FROM_UNIXTIME( created, '%Y%m%d' ) as day ,
SUBSTRING_INDEX(
GROUP_CONCAT( DISTINCT nid
ORDER BY created DESC
SEPARATOR ',' ), ',', :limit1 )
as nids
FROM node
WHERE FROM_UNIXTIME( created, '%Y%m%d' )
IN (
SELECT * FROM (
SELECT FROM_UNIXTIME(created,'%Y%m%d') FROM node GROUP BY FROM_UNIXTIME(created,'%Y%m%d') HAVING COUNT(*) >= :limit2 ORDER BY FROM_UNIXTIME(created,'%Y%m%d') DESC LIMIT 0,7
) as d
)
GROUP BY FROM_UNIXTIME( created, '%Y%m%d' )
) AS dates
WHERE FIND_IN_SET(nid, dates.nids)
";
$res = db_query($sql, array(':limit1' => 4, ':limit2' => 4));
foreach ($res as $r) {
print_r($r);
}
?>
что то вывелось, через полтора часа проверю, все ли в порядке