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
+43 -17
View File
@@ -677,7 +677,7 @@ 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
@@ -715,8 +715,11 @@ class gebiet extends basis_db
(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
ORDER BY lvlfr.nummer
LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = fragen.gebiet_id and fragenanzahl.level = fragen.level LIMIT 1)) fr)
AS frprolevel
FROM fragen FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
GROUP BY fragen.gebiet_id, level GROUP BY fragen.gebiet_id, level
@@ -724,43 +727,66 @@ class gebiet extends basis_db
ELSE ELSE
(SELECT sum(frprolevel) FROM (SELECT sum(frprolevel) FROM
( (
SELECT fragen.level, (sum(punkte) SELECT fragen.level,
* (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = fragen.gebiet_id and fragenanzahl.level = fragen.level LIMIT 1)) AS frprolevel (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 lvlfr.frage_id, lvlfr.nummer
ORDER BY lvlfr.nummer
LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = fragen.gebiet_id and fragenanzahl.level = fragen.level LIMIT 1)) fr)
AS frprolevel
FROM fragen FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
AND frage_id = (SELECT min(frage_id) FROM fragen fr WHERE fr.gebiet_id = fragen.gebiet_id AND fr.level = fragen.level)
GROUP BY fragen.gebiet_id, level GROUP BY fragen.gebiet_id, level
) pkteprolevel) ) pkteprolevel)
END) 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 (
SELECT min(punkte) AS pkte
FROM fragen FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id 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
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)
) minpkte
)
ELSE ELSE
(SELECT sum(punkte) (
SELECT sum(pkte)
FROM (SELECT sum(punkte) AS pkte
FROM fragen FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id 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)
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
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) END)
ELSE ELSE
(CASE WHEN tbl_gebiet.multipleresponse=false THEN (CASE WHEN tbl_gebiet.multipleresponse=false THEN
( (
SELECT min(punkte) SELECT sum(pkte)
FROM (SELECT min(punkte) AS pkte
FROM fragen FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id
) * (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1) GROUP BY frage_id, nummer
ORDER BY nummer
LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1)
) minpkte
)
ELSE ELSE
(SELECT sum(punkte) (
SELECT sum(pkte)
FROM (SELECT sum(punkte) AS pkte
FROM fragen FROM fragen
WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id 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) GROUP BY frage_id, nummer
)* (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1) ORDER BY nummer
LIMIT (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1)
) sumpkte
)
END) END)
END) * (-1) AS offsetpunkte END) * (-1) AS offsetpunkte