webForumDet fria alternativet

SQL-fråga, går detta att göra eller måste jag göra flera frågor?

PHP

1 svar · 445 visningar · startad av UrMe

Medlem sedan apr. 2001762 inlägg
Frågan#1

Jag har en SQL fråga som är uppbyggd så här:

$qrysql = "SELECT * FROM ";
$qrysql .= "(SELECT b.iCategory, b.sBannerfile, b.sType, b.sLink, b.sBannername, b.id as bid, c.id, c.sCategory, b.dStartdate, b.dEnddate, b.iWidth, b.iHeight, b.iPriority ";
$qrysql .= "FROM #__fl_banners b LEFT JOIN #__fl_banners_categories c ON (b.iCategory = c.id) ";
$qrysql .= "WHERE b.iPublished = 1 ";
$qrysql .= "AND b.dStartdate <= '".date("Y-m-d")."' ";
$qrysql .= "AND b.dEnddate >= '".date("Y-m-d")."' ";
$qrysql .= "AND (b.iImpressions < b.iMaxImpressions OR b.iMaxImpressions = 0) ";

/*Ser till så bannrarna tillhör rätt grupper.*/
if($params->groups != "") {
	$groups = explode(";", $params->groups);
	$qrysql .= "AND (";
	$i = 0;
	foreach($groups as $group) {
		if($i != 0) {
			$qrysql .= " OR ";
		}
		$qrysql .= "c.sCategory = '".$group."'";
		$i = 1;
	}
	$qrysql .= ") ";
}

$qrysql .= "ORDER BY RAND(NOW()) ";
$qrysql .= "LIMIT 0, ".$limit.") as a ";

/*Kollar om någon extra sortering är satt*/
$sortsql .= $sortorder1 != "" ? "a.".$sortorder1 : "";

if($sortorder2 != "") { 
	if($sortorder1 != "") {
		$sortsql .= ", ";
	}
	$sortsql .= "a.".$sortorder2;
}

$qrysql .= $sortsql != "" ? "ORDER BY ".$sortsql." " : "";

$params->groups är en sträng som kan se ut så här: "grupp1;grupp2;grupp3", den ser till så bara rätt grupper visas. Allting fungerar perfekt, den slumpar ut rätt antal jag vill ha etc. Det handlar om bannrar btw :)

Nu har jag en variabel som heter $limit där man kan styra hur många som ska visas. Mitt problem är att jag vill göra om detta så att jag kan styra exakt hur många från grupp1, grupp2 och grupp3 som kan visas. Bannrarna måste ju fortfarande slumpas fram.

Variabeln $params->groups tänkte jag ändra så den ser ut så här: "grupp1|1;grupp2|2;grupp3|1" t.ex.
Då ska 1 banner från grupp1 tas fram, 2 bannrar från grupp2, och 1 banner från grupp3.

Går detta att göra direkt i SQL frågan? Eller måste jag göra tre separata SQL frågor för varje grupp?

Medlem sedan apr. 2001762 inlägg
#2

En SQL fråga i "ren text" kan se ut så här:

SELECT * FROM 
(SELECT b.iCategory, b.sBannerfile, b.sType, b.sLink, b.sBannername, b.id as bid, c.id, c.sCategory, b.dStartdate, b.dEnddate, b.iWidth, b.iHeight, b.iPriority 
FROM #__fl_banners b LEFT JOIN #__fl_banners_categories c ON (b.iCategory = c.id) 
WHERE b.iPublished = 1 
AND b.dStartdate <= '2008-05-23' 
AND b.dEnddate >= '2008-05-23' 
AND (b.iImpressions < b.iMaxImpressions OR b.iMaxImpressions = 0) 
AND (c.sCategory = 'Guld' OR c.sCategory = 'Silver' OR c.sCategory = 'Brons') 
ORDER BY RAND(NOW()) LIMIT 0, 4) as a 
ORDER BY a.iHeight DESC, a.iPriority ASC
258 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)