I am working with a website with statistics to online game.
During this time , I’ve got some problems.
Could anyone look at this query?
I would like to get output with a records from last day in database.
This query \/ showing all the records from a table.(like 5k records)
SELECT olympa.name, olympa.experience, olympa_gained.gained
FROM olympa, olympa_gained
WHERE (olympa.rank = olympa_gained.rank AND olympa_gained.date =(SELECT MAX(date) from olympa_gained))
I need something in this kind :
SELECT olympa.name, olympa.experience, olympa_gained.gained
FROM olympa, olympa_gained
WHERE ( IF(olympa_gained.date =(SELECT MAX(date) from olympa_gained) THEN olympa.rank = olympa_gained.rank )
because atm it assign all the records from (olympa.rank = olympa_gained.rank)
SELECT olympa.name
, olympa.experience
, olympa_gained.gained
FROM olympa
INNER
JOIN ( SELECT rank
, MAX(date) AS latest_date
FROM olympa_gained
GROUP
BY rank ) AS m
ON m.rank = olympa.rank
INNER
JOIN olympa_gained
ON olympa_gained.rank = olympa.rank
AND olympa_gained.date = m.latest_date
I am getting same results with this code like with this one upper.
MySQL gave an output with 3,3k rows ( I Need only 300 rows ) every 300 rows have another date of a day.
That’s selecting first 300 rows instead of 300 with current date. [ all the code except a bold font statement ]
Is there possibility to add a WHERE STATEMENT before inner join?
SELECT olympa.name
, olympa.rank
, olympa.experience
, olympa_gained.gained
, olympa_weekly.weekly
, MAX( olympa.date ) as date
FROM olympa
[B]----- WHERE date = (SELECT MAX( date ) from Olympa)------[/B]
INNER
JOIN (
SELECT rank
, MAX( date ) AS latest_date
FROM olympa_gained
GROUP
BY rank
) AS m ON m.rank = olympa.rank
INNER
JOIN (
SELECT rank
, MAX( date ) AS wlatest_date
FROM olympa_weekly
GROUP
BY rank
) AS n ON n.rank = olympa.rank
INNER
JOIN olympa_gained
ON olympa_gained.rank = olympa.rank AND olympa_gained.date = m.latest_date
INNER
JOIN olympa_weekly
ON olympa_weekly.rank = olympa.rank AND olympa_weekly.date = n.wlatest_date
GROUP BY olympa_gained.rank ORDER BY olympa.experience DESC
This one took ( 300 rows fetched in 0,0035s(0,6423s) )
SELECT olympa.rank
, olympa.name
, olympa.level
, olympa.experience
, olympa_gained.gained
, olympa_weekly.weekly
, MAX( olympa.date ) as date
FROM olympa
INNER
JOIN (
SELECT rank
, MAX( date ) AS latest_date
FROM olympa_gained
GROUP
BY rank
) AS m ON m.rank = olympa.rank
INNER
JOIN (
SELECT rank
, MAX( date ) AS wlatest_date
FROM olympa_weekly
GROUP
BY rank
) AS n ON n.rank = olympa.rank
INNER
JOIN olympa_gained
ON olympa_gained.rank = olympa.rank AND olympa_gained.date = m.latest_date
INNER
JOIN olympa_weekly
ON olympa_weekly.rank = olympa.rank AND olympa_weekly.date = n.wlatest_date
WHERE olympa.date = m.latest_date
GROUP BY olympa_gained.rank ORDER BY olympa.experience DESC
Just added - olympa_voc.voc and this took much more , more than 3 minutes … 300 rows fetched in 0,0340s (181,2258s)
SELECT olympa.rank
, olympa.name
, olympa_voc.voc
, olympa.level
, olympa.experience
, olympa_gained.gained
, olympa_weekly.weekly
, MAX( olympa.date ) as date
FROM olympa
INNER
JOIN (
SELECT rank
, MAX( date ) AS latest_date
FROM olympa_gained
GROUP
BY rank
) AS m ON m.rank = olympa.rank
INNER
JOIN (
SELECT rank
, MAX( date ) AS wlatest_date
FROM olympa_weekly
GROUP
BY rank
) AS n ON n.rank = olympa.rank
INNER
JOIN olympa_voc
ON olympa_voc.name = olympa.name AND olympa.date = m.latest_date
INNER
JOIN olympa_gained
ON olympa_gained.rank = olympa.rank AND olympa_gained.date = m.latest_date
INNER
JOIN olympa_weekly
ON olympa_weekly.rank = olympa.rank AND olympa_weekly.date = n.wlatest_date
WHERE olympa.date = m.latest_date
GROUP BY olympa_gained.rank ORDER BY olympa.experience DESC
SELECT olympa.rank
, olympa.name
, olympa_voc.voc
, olympa.level
, olympa.experience
, olympa_gained.gained
, olympa_weekly.weekly
, MAX( olympa.date ) as date
FROM olympa
INNER
JOIN (
SELECT rank
, MAX( date ) AS latest_date
FROM olympa_gained
GROUP
BY rank
) AS m ON m.rank = olympa.rank
INNER
JOIN (
SELECT rank
, MAX( date ) AS wlatest_date
FROM olympa_weekly
GROUP
BY rank
) AS n ON n.rank = olympa.rank
INNER
JOIN (
SELECT name
FROM olympa_voc
GROUP
BY name
) AS z ON z.name = olympa.name
INNER
JOIN olympa_voc
ON olympa_voc.name = olympa.name
INNER
JOIN olympa_gained
ON olympa_gained.rank = olympa.rank
AND olympa_gained.date = m.latest_date
INNER
JOIN olympa_weekly
ON olympa_weekly.rank = olympa.rank
AND olympa_weekly.date = n.wlatest_date
WHERE olympa.date = m.latest_date
ORDER BY olympa.experience DESC
hmm I can’t specify a date = current date , cause not all tables have a current date.
Cause of kinda slow speed of update rows in one of my table , there’s no current date.
that’s olympa_voc.voc , all others have a current date.
That’s what I 've got if I do a query without olympa_voc.voc
SELECT olympa.rank
, olympa.name
, olympa.level
, olympa.experience
, olympa_gained.gained
, olympa_weekly.weekly
, MAX( olympa.date ) as date
FROM olympa
INNER
JOIN (
SELECT rank
, MAX( date ) AS latest_date
FROM olympa_gained
GROUP
BY rank
) AS m ON m.rank = olympa.rank
INNER
JOIN (
SELECT rank
, MAX( date ) AS wlatest_date
FROM olympa_weekly
GROUP
BY rank
) AS n ON n.rank = olympa.rank
INNER
JOIN olympa_gained
ON olympa_gained.rank = olympa.rank
AND olympa_gained.date = m.latest_date
INNER
JOIN olympa_weekly
ON olympa_weekly.rank = olympa.rank
AND olympa_weekly.date = n.wlatest_date
WHERE olympa.date = m.latest_date
GROUP BY olympa_gained.rank ORDER BY olympa.experience DESC