Autor Zpráva
igamenir
Profil
Zdravím, mám takový problém, který nevím, jak řešit jinak, než mnoha opakovanými dotazy na každého uživatele zvlášť, ale rád bych to spojil do jednoho dotazu.
Mám.. no zatím to v praxi neběží, ale mám to vyzkoušené v phpmyadmin... takže mám dotaz na uživatele a poslední návštěvy:

SELECT visitor AS visitorid,
MAX(visittime) AS lastvisit,
COUNT(*) AS visitcount,
NULL AS visittimesum
FROM visits AS t0 GROUP BY visitor;


Místo toho null bych pak moc rád zařadit dotaz na dobu návštěvy. To si dokážu zvlášť zjistit tímto dotazem (zde pro uživatele s id 1):

SELECT SUM(IF(diff>15,15,diff))+15 AS visittimesum
FROM (SELECT TIMESTAMPDIFF(MINUTE, t2.visittime, (
  SELECT MIN(t3.visittime) FROM visits AS t3
  WHERE t3.visittime> t2.visittime AND visitor=1)
) AS diff FROM visits AS t2
WHERE t2.visittime < (
  SELECT MAX(visittime) FROM visits WHERE visitor=1)
 AND visitor=1)
AS t1;


(fyi podstata dotazu: zjistím počet minut mezi jednotlivými návštěvami a sečtu je, maximálně však beru 15 minut, protože poté považuji uživatele za odhlášeného a samozřejmě přičtu 15 minut pro poslední návštěvu, které se musím předtím zbavit, protože žádnou další návštěvu nemá pro výpočet nemá)

Pokud ale dotazy spojím a 1 nahradím za t0.visitor, sql hlásí, že ten sloupec nezná. Tipl bych, že problém dělá to vložení přes FROM.

Nevěděl by prosím někdo jak to vyřešit? Mě sice napadají dva jiné způsoby, jak to obejít (dotazy přes php nebo okamžité sčítání při každé návštěvě), ale moc by mě zajímalo, jestli to jde nějak řešit přes takovýto nějaký dotaz.

Předem dík za jakékoliv odpovědi
Kajman_
Profil *
Jestli na to nezkusit využít uživatelské proměnné...

SELECT visitor AS visitorid,
       MAX(visittime) AS lastvisit,
       COUNT(*) AS visitcount,
       sum(delka) + 15 AS visittimesum
FROM   (SELECT v.visitor,
               v.visittime,
               least(timestampdiff(minute, @lasttime, v.visittime) * (@lastuser = v.visitor), 15) delka,
               @lastuser := v.visitor lv,
               @lasttime := v.visittime lt
        FROM   visits v, (select @lastuser := 0, @lasttime := now()) t
        order  by visitor, visittime) t0
GROUP  BY visitor;


Ale rychlé to moc nebude, pokud je to třeba často počítat, tak bych si to do nějakého sloupečku předpočítal.
igamenir
Profil
dík moc , funguje :)
ale máš pravdu, budu to ukládat do tabulky s uživateli. tohle jsem zjišťoval spíš, abych vyzkoušel ten nápad a naučil se tím něco nového.
Toto téma je uzamčeno. Odpověď nelze zaslat.