Comment récupérer les données de la semaine dernière à partir de l'heure du lundi (00:00:01) et terminer le dimanche (23:59:59) ... identique à cette semaine en cours à partir de l'heure du lundi (00:00:01) et se termine le dimanche (23:59:59)
CE que j'ai essayé!
$query = "SELECT users.name,count(*) as count,
campaign.campaign_name,
campaign.payout_cost*count(*) as totalPrice
FROM users
JOIN transactions on users.uid=transactions.uid
JOIN campaign on campaign.campaign_id_id=transactions.campaign_id
WHERE uid=$uid
AND `date` >= DATE_SUB(DATE(NOW()), INTERVAL DAYOFWEEK(NOW())+6 DAY)
AND `date` < DATE_SUB(DATE(NOW()), INTERVAL DAYOFWEEK(NOW())-1 DAY)
GROUP BY campaign.campaign_name_name ";
3 Réponses :
Deux façons de le faire ...
select data from tableName where date between date_sub(now(),INTERVAL 1 WEEK) and now(); select data FROM tableName wherdate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
Vous pouvez utiliser WEEK () , qui renvoie le numéro de semaine pour une date donnée, en ajoutant
AND WEEK (date-INTERVAL 1 DAY) = WEEK (NOW ()) - 1 code> pour obtenir les données de la semaine en cours du lundi au dimanche,
et
AND WEEK (date-INTERVAL 1 DAY) = WEEK (NOW ()) - 2 pour les données de la semaine précédente
dans la condition WHERE après WHERE uid = $ uid
comme p>
$query = "SELECT c.campaign_name,
COUNT(*) as total_count,
SUM(c.payout_cost) as total_payout
FROM transactions t
JOIN campaign c
ON c.campaign_id = t.campaign_id
WHERE uid = $uid
AND WEEK(date - INTERVAL 1 DAY) = WEEK(NOW()) - 1
GROUP BY c.campaign_name ";
et remplacer WEEK (NOW ()) - 1 par WEEK (NOW ()) - 2 , également
il me donne "$ query =" vide sélectionnez count (*) comme count, sum (campaign.payout_cost) comme total des transactions rejoindre la campagne sur campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND WEEK (date-INTERVAL 1 DAY ) = SEMAINE (MAINTENANT ()) - 1 ";"
idem ici "$ query =" select campaign.campaign_name, count (*) as total_count, sum (campaign.payout_cost) as total_payout from transactions join campaign on campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid GROUP BY campaign_name AND WEEK ( date-INTERVAL 1 JOUR) = SEMAINE (MAINTENANT ()) - 1 ";"
J'ai dit que vous deviez ajouter dans la condition WHERE, pas dans la liste GROUP BY. J'ai édité @marcomasx, jetez un œil à cela s'il vous plaît.
Ok mon pote merci! Je l'ai essayé mais je me suis toujours laissé vide: (Je ne sais pas quel est le problème ..
C'est toute la requête
Toujours vide :( "$ query =" sélectionnez campaign.campaign_name, count (*) as total_count, sum (campaign.payout_cost) comme total_payout des transactions rejoindre la campagne sur campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND WEEK ( date - INTERVAL 1 DAY) = SEMAINE (MAINTENANT ()) - 1 GROUP BY nom_campagne ";"
N'importe qui s'il vous plaît! Il retourne dans un vide $ query = "SELECT c.campaign_name, COUNT (*) as total_count, SUM (c.payout_cost) as total_payout FROM transactions t JOIN campaign c ON c.campaign_id = t.campaign_id WHERE uid = $ uid AND WEEK (date - INTERVAL 1 JOUR) = SEMAINE (MAINTENANT ()) - 1 GROUP BY c.campaign_name ";
Vous êtes sur la bonne voie en évitant les fonctions comme week () sur la colonne - qui ne font que gâcher l'optimiseur. D'autre part, le paramètre uid doit être passé en tant que paramètre plutôt que de munging la chaîne de requête.
Vous voulez utiliser le jour de la semaine () parce que vous voulez que les semaines commencent un lundi. Juste un peu d'arcanisme de MySQL: week-end () renvoie 0 pour lundi alors que dayofweek () renvoie 2 pour lundi.
Donc, la logique pour la semaine en cours serait:
date >= curdate() - interval 7 + weekday(curdate()) day and date < curdate() + interval - weekday(curdate()) day
Pour la semaine dernière, ce serait:
date >= curdate() - interval weekday(curdate()) day and date < curdate() + interval 7 - weekday(curdate()) day
J'ai essayé ça. Mais ne fonctionne pas "sélectionnez count (*) comme count, sum (campaign.payout_cost) comme total des transactions rejoindre la campagne sur campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND 'dateTime'> = curdate () - intervalle de la semaine ( ) jour et 'dateTime'
Qu'est-ce que
Donc, la valeur doit être date .. la dateTime est de la colonne .. donc c'est faux alors?
mais ça me donne du blanc
$ query = "sélectionnez campaign.campaign_name, count (*) as total_count, sum (campaign.payout_cost) as total_payout des transactions rejoindre la campagne sur campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND date> = curdate () - interval jour de la semaine (curdate ()) jour et date
'datetime' ? Cette syntaxe n'est pas correcte et il n'y a pas de guillemets simples dans cette réponse.
Cela ressemble énormément à PHP combiné avec MySQL. Dans ce cas, vous devriez vraiment utiliser les déclarations préparées et les requêtes paramétrées en utilisant mysqli ou PDO. La structuration d'une requête avec une injection directe d'une variable (surtout si elle est basée sur une entrée) vous ouvre à une potentielle attaque par injection SQL (attaque SQLI).
J'apprends toujours 😁 mais de toute façon merci pour les conseils