gebiet.class.php: improved offset calculation, LIMIT maxfragen instead multiplication

This commit is contained in:
alex
2020-02-21 17:22:50 +01:00
parent f146afb77f
commit 0addc4ffb5
+82 -56
View File
@@ -677,13 +677,13 @@ class gebiet extends basis_db
$qry = " $qry = "
WITH fragen AS ( WITH fragen AS (
SELECT tbl_frage.frage_id, tbl_frage.gebiet_id, tbl_frage.level, punkte SELECT tbl_frage.frage_id, tbl_frage.gebiet_id, tbl_frage.level, tbl_frage.nummer, punkte
FROM testtool.tbl_frage FROM testtool.tbl_frage
JOIN testtool.tbl_vorschlag USING (frage_id) JOIN testtool.tbl_vorschlag USING (frage_id)
WHERE tbl_vorschlag.aktiv WHERE tbl_vorschlag.aktiv
AND tbl_vorschlag.punkte < 0 AND tbl_vorschlag.punkte < 0
AND tbl_frage.demo = false AND tbl_frage.demo = false
AND tbl_frage.aktiv AND tbl_frage.aktiv
), ),
fragenanzahl AS ( fragenanzahl AS (
SELECT gebiet_id, level, levelgleichverteilung, SELECT gebiet_id, level, levelgleichverteilung,
@@ -712,57 +712,83 @@ class gebiet extends basis_db
tbl_gebiet.level_start, tbl_gebiet.level_start,
( (
CASE WHEN tbl_gebiet.levelgleichverteilung THEN CASE WHEN tbl_gebiet.levelgleichverteilung THEN
(CASE WHEN tbl_gebiet.multipleresponse=false THEN (CASE WHEN tbl_gebiet.multipleresponse=false THEN
(SELECT sum(frprolevel) FROM (SELECT sum(frprolevel) FROM
( (
SELECT fragen.level, (min(punkte) SELECT fragen.level, (SELECT sum(punkte) FROM (SELECT min(punkte) AS punkte FROM fragen lvlfr WHERE lvlfr.gebiet_id = fragen.gebiet_id and lvlfr.level = fragen.level
* (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = fragen.gebiet_id and fragenanzahl.level = fragen.level LIMIT 1)) AS frprolevel GROUP BY lvlfr.frage_id, lvlfr.nummer
FROM fragen ORDER BY lvlfr.nummer
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = fragen.gebiet_id and fragenanzahl.level = fragen.level LIMIT 1)) fr)
GROUP BY fragen.gebiet_id, level AS frprolevel
) pkteprolevel) FROM fragen
ELSE WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
(SELECT sum(frprolevel) FROM GROUP BY fragen.gebiet_id, level
( ) pkteprolevel)
SELECT fragen.level, (sum(punkte) ELSE
* (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = fragen.gebiet_id and fragenanzahl.level = fragen.level LIMIT 1)) AS frprolevel (SELECT sum(frprolevel) FROM
FROM fragen (
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id SELECT fragen.level,
AND frage_id = (SELECT min(frage_id) FROM fragen fr WHERE fr.gebiet_id = fragen.gebiet_id AND fr.level = fragen.level) (SELECT sum(punkte) FROM (SELECT sum(punkte) AS punkte FROM fragen lvlfr WHERE lvlfr.gebiet_id = fragen.gebiet_id and lvlfr.level = fragen.level
GROUP BY fragen.gebiet_id, level GROUP by lvlfr.frage_id, lvlfr.nummer
) pkteprolevel) ORDER BY lvlfr.nummer
END) LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = fragen.gebiet_id and fragenanzahl.level = fragen.level LIMIT 1)) fr)
AS frprolevel
FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
GROUP BY fragen.gebiet_id, level
) pkteprolevel)
END)
WHEN tbl_gebiet.level_start IS NOT NULL THEN WHEN tbl_gebiet.level_start IS NOT NULL THEN
(CASE WHEN tbl_gebiet.multipleresponse=false THEN (CASE WHEN tbl_gebiet.multipleresponse=false THEN
( (SELECT sum(pkte)
SELECT min(punkte) FROM (
FROM fragen SELECT min(punkte) AS pkte
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
AND fragen.level = tbl_gebiet.level_start AND fragen.level = tbl_gebiet.level_start
) * (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id AND fragenanzahl.level = tbl_gebiet.level_start LIMIT 1) GROUP BY frage_id, nummer
ELSE ORDER BY nummer
(SELECT sum(punkte) LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id AND fragenanzahl.level = tbl_gebiet.level_start LIMIT 1)
FROM fragen ) minpkte
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id )
AND frage_id = (SELECT min(frage_id) FROM fragen WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id) ELSE
AND fragen.level = tbl_gebiet.level_start (
)* (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id AND fragenanzahl.level = tbl_gebiet.level_start LIMIT 1) SELECT sum(pkte)
END) FROM (SELECT sum(punkte) AS pkte
FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
AND fragen.level = tbl_gebiet.level_start
GROUP BY frage_id, nummer
ORDER BY nummer
LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id AND fragenanzahl.level = tbl_gebiet.level_start LIMIT 1)
) sumpkte
)
END)
ELSE ELSE
(CASE WHEN tbl_gebiet.multipleresponse=false THEN (CASE WHEN tbl_gebiet.multipleresponse=false THEN
( (
SELECT min(punkte) SELECT sum(pkte)
FROM fragen FROM (SELECT min(punkte) AS pkte
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id FROM fragen
) * (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1) WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
ELSE GROUP BY frage_id, nummer
(SELECT sum(punkte) ORDER BY nummer
FROM fragen LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1)
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id ) minpkte
AND frage_id = (SELECT min(frage_id) FROM fragen WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id) )
)* (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1) ELSE
END) (
SELECT sum(pkte)
FROM (SELECT sum(punkte) AS pkte
FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
GROUP BY frage_id, nummer
ORDER BY nummer
LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1)
) sumpkte
)
END)
END) * (-1) AS offsetpunkte END) * (-1) AS offsetpunkte
FROM FROM
testtool.tbl_gebiet testtool.tbl_gebiet
@@ -770,7 +796,7 @@ class gebiet extends basis_db
EXISTS( EXISTS(
SELECT 1 FROM fragen WHERE fragen.gebiet_id=tbl_gebiet.gebiet_id SELECT 1 FROM fragen WHERE fragen.gebiet_id=tbl_gebiet.gebiet_id
) )
AND gebiet_id = ".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND gebiet_id = ".$this->db_add_param($gebiet_id, FHC_INTEGER)."
"; ";
if($this->db_query($qry)) if($this->db_query($qry))