mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-24 02:12:17 +00:00
gebiet.class.php: improved offset calculation, LIMIT maxfragen instead multiplication
This commit is contained in:
+81
-55
@@ -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,56 +712,82 @@ 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
|
||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user