Запрос к базе

Аватар пользователя dgastudio dgastudio 21 июля 2016 в 7:57

Добрый день.

подскажите с запросом к d7.

нужно сделать вот такой блок, http://c2n.me/3Apy470.jpg

для этого, мне нужно получить по 4 публикации за последние 7 дней у которых есть публикации.

то есть, если за вчера нет 4 публикаций, дату пропускаем.

за готовое решение в формате db_select или db_query готов отблагодарить финансово.

спасибо

0 Thanks

Комментарии

Аватар пользователя goodboy goodboy 21 июля 2016 в 10:29

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));

Аватар пользователя goodboy goodboy 21 июля 2016 в 13:33

Проверьте, будет ли 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)

Аватар пользователя dgastudio dgastudio 21 июля 2016 в 10:43

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

а мне нужно за прошедшие 7 дней есть у них есть более 4 публикаций за день. то есть, если сегодня четверг и за прошлые выходные не было публикаций, 7 дней = начиная с прошлого вторника

Аватар пользователя goodboy goodboy 21 июля 2016 в 13:44

Тут я предлагаю итерационно решать вопрос. В случае, если были пропуски в публикациях, увеличивать интервал

$pDaysLimit = 7
$pLimit = 4;
$pDays = $pDaysLimit;

1. Сделали запрос c параметром $pCreated = time() - $pDays *24*60*60
2. Возвратило записей не менее $pDaysLimit * $pLimit ?
2.1 Да, выводим, выход
2.2 Нет, $pDays++ и возвращаемся к п.1

Аватар пользователя dgastudio dgastudio 21 июля 2016 в 14:04

я тоже думал про это, просто сделать рекурсивную функцию которая будет по дням шлепать назад и если кол-во публикаци не день меньше чего либо, вызывать снова саму себя пока не получится искомое количество позиций.

но подумал, возможно одним запросом это дело решить

спасибо за помощь

Аватар пользователя goodboy goodboy 21 июля 2016 в 16:27

Последнюю попытку можно? Единственное, 7 не получилось в параметры вставить

<?php

$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);
}

?>