MySQL Query zusammenfassen

Maik Müller

Grünschnabel
Hallo bzw. guten Abend,

also ich muss zugeben, ich habe seit einiger Zeit schon vieles ausprobiert, einige Codeschnipsel durchstöbert und mir auch andere Beiträge angesehen, aber ich komm nicht auf das, was ich suche.

Vorweg muss ich zugeben, das ich nicht all zuviel Ahnung von PHP habe und noch in der Lernphase bin. Nun zu meinem Problem. Ich habe mehrere MySQL Abfragen für verschiedene Überprüfungen in einem Formular. Nun habe ich mehere Tabellen (4 Stück) und in meinem Formular soll es verschiedene Überprüfungen aus allen 4 Tabelle geben.

PHP:
<?php
  $_dbSpam = mysql_query('SELECT * FROM `_UrlShorter` WHERE `Us_Dns` = "'.getenv('remote_addr').'" ORDER BY `Us_UnixTime` DESC');
  $_dbRowSpam = mysql_fetch_array($_dbSpam);

  $_dbBlacklist = mysql_query('SELECT * FROM `_UrlBlacklist` WHERE `Ub_Url` = "'.strtolower($_PasredUrl['domain']).'"');
  $_dbRowBlacklist = mysql_num_rows($_dbBlacklist);

  $_dbCloakinglist = mysql_query('SELECT * FROM `_UrlCloakinglist` WHERE `Uc_Url` = "'.strtolower($_PasredUrl['domain']).'"');
  $_dbRowCloakinglist = mysql_num_rows($_dbCloakinglist);

  $_dbUrl = mysql_query('SELECT * FROM `_UrlShorter` WHERE `Us_Url` = "'.$_OrdVariable['Url'].'"');
  $_dbRowUrl = mysql_fetch_array($_dbSelUs);

  $_dbCId = mysql_query('SELECT * FROM `_UrlShorter` WHERE `Us_UrlId` = "'.$_OrdVariable['CoustomUrlId'].'"');
  $_dbRowCId = mysql_num_rows($_dbCId);
?>

Nun ist es sehr unübersichtlich und wollte eigendlich fragen, ob es eine Möglichkeit gibt, diese zu optimieren bzw. alles in einer Abfrage zu packen und es ähnlich wie bei einem Array Mithilfe von array_merge() diese zusammenzufassen, um alles in einer Variablen zu haben.

Gibt es da Vorschläge eurerseits?
 
Hallo,

ohne eine "Offenlegung" der Tabellenstruktur lässt sich das schwer sagen, ob diese Abfragen zusammengeführt werden können. Rein von den Where-Bedingungen ausgegangen, könnte man annehmen, dass die Tabellen _UrlBlacklist, _ UrlCloakinglist und _UrlShorter in einer Abfrage per JOIN zusammengeführt werden können. Ich versuch mal das aufzudröseln:
SQL:
SELECT * FROM _UrlShorter us 
LEFT JOIN _UrlBlacklist ub
  ON us.Us_Url = ub.Ub_Url 
LEFT JOIN _UrlCloakinglist uc 
  ON us.Us_Url = uc.Uc_Url 
WHERE us.Us_Dns = '".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."' 
ORDER BY us.Us_UnixTime DESC;

Grüße
 
Zuletzt bearbeitet von einem Moderator:
UNION heisst der Befehl
Du zählst da aber nur die Einträge durch. Der Inhalt der Tabellen wertest du nicht weiter aus.

Zählst du nachher alle $_dbRowXYZ zusammen oder muss du sie weiter einzeln verwerten?

SQL:
-- _UrlShorter zählen:
SELECT 
	COUNT(*)         AS item_count,
	'_dbRowSpam'     AS var_name
FROM
	`_UrlShorter` 
WHERE 
	`Us_Dns` = '{$usDns}'
-- _UrlBlacklist zählen:
UNION SELECT 
	COUNT(*),
	'_dbRowBlacklist'
FROM
	`_UrlBlacklist` 
WHERE
	`Ub_Url` = '{$ubUrl}'
-- _UrlCloakinglist zählen:
UNION SELECT 
	COUNT(*),
	'_dbRowCloakinglist'
FROM
	`_UrlCloakinglist`
WHERE
	`Uc_Url` = '{$ucUrl}'
-- etc
Ergibt eine Tabelle in der Art
item_countvar_name
123_dbRowSpam
456_dbRowBlacklist
789_dbRowCloakinglist

Und das einfach auswerten
PHP:
	$usDns = getenv('remote_addr');
	$ubUrl = strtolower($_PasredUrl['domain']);
	$ucUrl = strtolower($_PasredUrl['domain']);

	$sql = <<<SQL
		SELECT 
			COUNT(*)         AS item_count,
			'_dbRowSpam'     AS var_name
		FROM
			`_UrlShorter` 
		WHERE 
			`Us_Dns` = '{$usDns}'
		UNION SELECT 
			COUNT(*),
			'_dbRowBlacklist'
		FROM
			`_UrlBlacklist` 
		WHERE
			`Ub_Url` = '{$ubUrl}'
		UNION SELECT 
			COUNT(*),
			'_dbRowCloakinglist'
		FROM
			`_UrlCloakinglist`
		WHERE
			`Uc_Url` = '{$ucUrl}'
		-- etc
SQL;
	
	$result = mysql_query($sql);
	while($row = mysql_fetch_assoc($result)){
		$$row['var_name'] = $row['item_count'];
	}

	// Auswerten von $_dbRowSpam
	echo $_dbRowSpam;
 
Zuletzt bearbeitet von einem Moderator:
Zurück