MySQL 2 Abfragen zusamenfassen

Joe

Erfahrenes Mitglied
Hallo Tutorials.de,

Kann mir jemand helfen die ersten beiden Abfragen des folgenden Codes als eine Abfrage zusammenzufassen?
Folgender Code tut was er soll (Alle Strahlenkreise User und Positionen bestimmen um neue Str-Intensität festzuelegen) und ist hoffe ich ausreichenden kommentiert. Leider tue ich mich mit Joins dieser Grössenordnung so schwer das ich nichtmal weiss wo ich anfangen sollte.

PHP:
//// Strahlenbelastung wenn User im Feld steht

// Alle User und Positionen holen
$sql = "SELECT
			Username,
			MoveX,
			MoveY
		FROM
			User
		WHERE
			MoveX!=NULL";
$result = mysql_query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row = mysql_fetch_assoc($result)) {
	$Usern[]=$row["Username"];
	$MoveX[]=$row["MoveX"];
	$MoveY[]=$row["MoveY"];
}

// für jeden User prüfen ob er im Strahlenfeld steht
for ($i=0; $i<count($Usern); $i++) {
	// DB-Abfrage ob Position des User innerhalb des Strahlungskreises
	$getStrahlung2 = "
			SELECT
				Radius,
				MPX,
				MPY,
				Intensity,
				SQRT(
					POW($MoveX[$i] - `MPX`,2) +
					POW($MoveY[$i] - `MPY`,2)) 
				AS distance
			FROM
				Strahlung
			HAVING 
				distance < Radius 
			ORDER BY distance";
	$Strahlung2 = mysql_query($getStrahlung2);
	if (mysql_errno()) {		
		echo mysql_errno() . ": " . mysql_error(). "\n";
	}
	if (!$Strahlung2) {
		die ('Etwas stimmte mit dem Query nicht: '.$db->error);
	}
	// User steht in einem oder mehren Strahlenkreisen
	if(mysql_num_rows($Strahlung2)!= 0) {
		// höchste Intensität ermitteln
		unset($IntensityMap2);
		while ($row = mysql_fetch_assoc($Strahlung2)) {
			$IntensityMap2[]=$row["Intensity"];
		}
		if (1<count($IntensityMap2)) {
			for ($t=0; $t<count($IntensityMap2); $t++) {
				if (!$val OR $val<$IntensityMap2[$t]) {
					$val = $IntensityMap2[$t];
				}
			}
		}
		else {
			$val = $IntensityMap2[0];
		}
		$getStrahlung4 = "
				SELECT
					*
				FROM
					Strahlenbelastung
				WHERE
					Username= '$Usern[$i]'";
		$Strahlung4 = mysql_query($getStrahlung4);
		if (mysql_errno()) {		
			echo mysql_errno() . ": " . mysql_error(). "\n";
		}
		while ($row = mysql_fetch_assoc($Strahlung4)) {
			$RADLvl2=$row["RADLvl"];
		}
		if ($RADLvl2<$val) {
			// Mache Radupddate
			mysql_query("UPDATE
							Strahlenbelastung
						SET
							RADLvl='$val'
						Where
							Username= '$Usern[$i]'");
			if (mysql_errno()) {		
				echo mysql_errno() . "222: " . mysql_error(). "\n";
			}
			if (mysql_affected_rows() == 0) {
				mysql_query("INSERT INTO
						Strahlenbelastung
									(Username,
									RADLvl)
								VALUES
									('$Usern[$i]','$val')");
				if (mysql_errno()) {		
					echo mysql_errno() . "1: " . mysql_error(). "\n";
				}
			}
		}
	}
}

Würde mich freuen wenn ihr mir nen Stück weit weiter helfen könnt oder andre Tipps habt.
Gruss Joe.
 
Die ersten 2 Queries kombiniert man hier nicht mit einem JOIN. Du berechnest die Kombination von jedem User mit jeder Strahlung. Ergo kein JOIN sondern einfach beide Tabellen auflisten und kombinieren.
Im WHERE kannst du dann das Ding mit dem Radius und der Distanz noch filtern.
SQL:
SELECT
	u.username,
	s.intensity,
	s.radius,
	SQRT(POW(u.movex - s.mpx,2) + POW(u.movey - s.mpy,2)) AS distance
FROM
	user        AS u,
	strahlung   AS s
WHERE
	NOT u.movex IS NULL
	AND s.radius > SQRT(POW(u.movex - s.mpx,2) + POW(u.movey - s.mpy,2))

Oder im Endeffekt ohne die unnötigen Felder im SELECT
SQL:
SELECT
	u.username,
	s.intensity
FROM
	user        AS u,
	strahlung   AS s
WHERE
	NOT u.movex IS NULL
	AND s.radius > SQRT(POW(u.movex - s.mpx,2) + POW(u.movey - s.mpy,2))
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Joe
Einmalig Danke!
Ist es möglich eine 3.e Tabelle zu involvieren (Strahlenbelastung) in der ich prüfe ob s.Intensität grösser als RADLvl des jeweiligen Username ist?
Am Ende benötige ich nur die Username und die Intensiät für das Update der Tabelle Strahlenbelastung.

Habe das hier versucht aber das ist noch nicht so korreckt.
Ohne die 3.e Tabelle hingegen funktioniert dein Code bestens!
SQL:
SELECT
    u.Username,
    s.Intensity,
    s.Radius,
	sb.RADLvl
FROM
    User        AS u,
    Strahlung   AS s,
	Strahlenbelastung AS sb
WHERE
    NOT u.MoveX IS NULL
	AND u.MoveX !=u.PosX # PosX und PosY ist Position des Bunker
	AND u.MoveY !=u.PosY
    AND s.radius > SQRT(POW(u.MoveX - s.MPX,2) + POW(u.MoveY - s.MPY,2))
	AND s.Intensity > sb.RADLvl
 
Zuletzt bearbeitet von einem Moderator:
Ok es ist mir gelungen das exakt nur die User und Intensität geholt werden welche wirklich geupdatet werden sollen.

Danke nochmals an Yaslaw ich blicke immer mehr durch was die Joins betrifft sowie normalen Aliasen also Zuweisungen.

$sql = "
SQL:
SELECT
    u.Username,
	u.MoveX,				# Position des User
	u.MoveY,
	u.PosX,					# Bunker des User
	u.PosY,
    s.Intensity, 			# Strahlenintensität des Strahlenkreises
	s.Radius,
	s.MPX,					# Mittelpunkt des Strahlungkreises
	s.MPY,
	Strahlenbelastung.RADLvl # Strahlenintensität des Users
FROM
	Strahlung   AS s,
    User        AS u
LEFT JOIN Strahlenbelastung
	ON u.Username=Strahlenbelastung.Username
WHERE
    NOT u.MoveX IS NULL
	AND IFNULL(Strahlenbelastung.RADLvl,0)<s.Intensity  # Wenn keine Strahlenbelastung auf User dann nimm 0 (erforderlich durch den LEFT JOIN)
														# prüfe gegen aktuele Strahlenintensität
    AND s.Radius > SQRT(POW(u.MoveX - s.MPX,2) + POW(u.MoveY - s.MPY,2)) # Entfernung kreisförmig
	AND NOT (u.MoveX=u.PosX AND u.MoveY=u.PosY) # Bunker strahlensicher
";
PHP:
$result = mysql_query($sql);
if (!$result) {
	('Etwas stimmte mit dem Query nicht: '.$db->error);
}
if (mysql_errno()) {		
	echo mysql_errno() . "222: " . mysql_error(). "\n";
}
unset($Intensity);
while ($row = mysql_fetch_assoc($result)) {
	$Usern[]=$row["Username"];
	$Intensity[]=$row["Intensity"];
	$RADLvl4[]=$row["RADLvl"];
}

var_dump($Usern);
echo "</br>";
var_dump($Intensity);
echo "</br>";
var_dump($RADLvl4);
for ($i=0; $i<count($Usern); $i++) {
	if ($RADLvl4[$i]<$Intensity[$i]) {
		// Mache Radupddate
		mysql_query("UPDATE
						Strahlenbelastung
					SET
						RADLvl='$Intensity[$i]'
					Where
						Username= '$Usern[$i]'");
		if (mysql_errno()) {		
			echo mysql_errno() . "222: " . mysql_error(). "\n";
		}
		if (mysql_affected_rows() == 0) {
			mysql_query("INSERT INTO
							Strahlenbelastung
							(Username,
							RADLvl)
						VALUES
							('$Usern[$i]','$Intensity[$i]')");
			if (mysql_errno()) {		
				echo mysql_errno() . "1: " . mysql_error(). "\n";
			}
		}
	}
}
 
Zuletzt bearbeitet von einem Moderator:
Tipp am Rande. Verwende in SQL '-- ' (Mit Leerzeichen!)als Marker für Kommentar. Dieser ist a) auch in Oracle gültig, b) erkennt die Forensoftware ihn auch als Kommentar und c) funktioniert der mWn im gegensatz zu # auch in phpMyAdmin.

SQL:
SELECT
    u.Username,
    u.MoveX,                # POSITION des USER
    u.MoveY,
    u.PosX,                 -- Bunker des USER
    u.PosY,
...
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Joe
Ok werds mir angewöhnen. In phpMyAdmin ging # zwar auch, aber ist ja nicht ausgeschlossen das es versionsabhängig ist. Allemal zwecks der Lesbarkeit hier auf Tutorials.de werd ichs mir mit -- angewöhnen :)
 

Neue Beiträge

Zurück