• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

If Abfrage mit Count eines anderen Selectes

CGollhardt

Mitglied
Guten Tag,

ich möchte gerne folgenden PHP Code:

PHP:
		$count = $db -> count_rows ('SELECT id FROM userprogress
			WHERE gamertagid = "' . $clanmitglied -> id . '" AND gameid = "' . $game -> id . '"');
		if ($count > 0) {
			//Folgendes Noch Umsetzen:
			//Select....... IF count rows von oben in einem MySQL Statement
			$MitgliedsDaten = $db -> select ('SELECT id, gamertag FROM members WHERE id = "' . $clanmitglied -> userid . '"', true);
			if (isset ($BesitzerLink)) {
				$BesitzerLink .= ', <a href="&id=' . $MitgliedsDaten -> id . '">' . $MitgliedsDaten -> gamertag . '</a>';
			} else {
				$BesitzerLink = '<a href="&id=' . $MitgliedsDaten -> id . '">' . $MitgliedsDaten -> gamertag . '</a>';
			}
		}
auf eine einzige Datenbankabfrage Reduzieren. Ich bin soweit:
PHP:
		$MitgliedsDaten = $db -> select ('IF (
			COUNT(*) FROM userprogress
			WHERE gamertagid = "' . $clanmitglied -> id . '" AND gameid = "' . $game -> id . '"
		) > 0 THEN SELECT id, gamertag FROM members WHERE id = "' . $clanmitglied -> userid . '"', true);
		if (isset ($MitgliedsDaten -> id)) {
			if (isset ($BesitzerLink)) {
				$BesitzerLink .= ', <a href="&id=' . $MitgliedsDaten -> id . '">' . $MitgliedsDaten -> gamertag . '</a>';
			} else {
				$BesitzerLink = '<a href="&id=' . $MitgliedsDaten -> id . '">' . $MitgliedsDaten -> gamertag . '</a>';
			}
		}
Leider ist mein Wissen über Datenbanken sehr beschränkt. Daher auch der "komische" SQL Querry, der nicht funktioniert.

Es geht eigentlich nur um den SQL Befehl im zweiten Abschnitt. Ich hoffe ihr könnt erkennen, wie ich diesen gerne hätte.

Ist es möglich den PHP Code mit beiden Querrys so umzuschreiben, das nur ein mysql_fetch_array() verwendet wird?

Das ganze läuft in einer ziemlich großen Schleife. Wäre diese Möglichkeit auch Performanter, als die bereits verwendete, oder erzeugt dies das Gegenteil?

Hinter $db -> select () hängt ein mysql_fetch_array()

Vielen Dank für eure Mühe.

edit:
Ich verwende mysql_fetch_object und nicht array, aber das kommt im endefekt aufs gleiche hinaus
 
Zuletzt bearbeitet:
Wenn ich das Datenbankmodell aus deinem Schnippsel korrekt interpretiere, dann sollte das eigentlich reichen:

Code:
SELECT members.id AS memberid, members.gamertag
FROM userprogress, members
WHERE userprogress.gamertagid = "' . $clanmitglied -> id . '" 
AND userprogress.gameid = "' . $game -> id . '
AND userprogress.id = members.id

Kann natürlich sein, dass ich etwas nicht verstanden habe. Wenn nicht, dann schreib mal bitte genau auf, was Du aus welchen Tabellen auslesen willst.
 
Ich verwende folgende Datenbank Struktur:
Code:
	'CREATE TABLE `members` (
		`id` INTEGER NOT NULL AUTO_INCREMENT,
		`username` VARCHAR(15),
		`passwort` CHAR(32),
		`email` VARCHAR(50),
		`gamertag` VARCHAR(25),
		`vorname` VARCHAR(25),
		`nachname` VARCHAR(25),
		`geburtstag` DATE,
		`rechte` TINYINT NOT NULL DEFAULT "1",
		`lastactivity` DATETIME,
		PRIMARY KEY (`id`),
		INDEX (`username`),
		INDEX (`passwort`)
	)
	'CREATE TABLE `userprogress` (
		`id` INTEGER NOT NULL AUTO_INCREMENT,
		`gameid` INTEGER,
		`gamertagid` INTEGER,
		`gamerscore` SMALLINT,
		`achievements` SMALLINT,
		`lastplayed` DATETIME,
		PRIMARY KEY (`id`),
		INDEX (`gamertagid`)
	)

Wenn folgende Abfrage eine Zeile mindestens eine Zeile ergeben würde:

PHP:
'SELECT id FROM userprogress WHERE gamertagid = "' . $clanmitglied -> id . '" AND gameid = "' . $game -> id . '"'

Dann soll mir dieser Befehl an mysql_fetch_object() übergeben werden:

PHP:
'SELECT id, gamertag FROM members WHERE id = "' . $clanmitglied -> userid . '"'

Im Idealfall möchte ich beide Befehle ausführen, in dem ich ein einziges mal my_fetch_array() ausführe, und im Objekt die Eigenschaft id und gamertag entweder zur Verfügung steht oder nicht.

Es handelt sich hierbei um eine Liste von Spielen, in der jedes Spiel mittels einer Schleife durchlaufen und ausgegeben wird und dann geprüft wird, ob ein bestimmter User dieses auch hat, wenn dann, soll er neben dem Spiel auftauchen. Beispiel: German Gamer Society &bull; GGS Xbox 360 Clan » Spiele

Der 1. Befehl überprüft ob der User diese Spiel hat (Schleife von allen Spielen), wenn dies der Fall ist soll der 2. Befehl in Kraft treten, in dem er mir seinen Gamertag (Spielernamen), und seine ID (für Links) selected. Dann kann ich dies über php ausgeben.

Ich hoffe das bringt ein wenig Klarheit darüber, was ich umsetzen möchte.
 
Dann hatte ich es ja schon fast getroffen.

Code:
SELECT members.id AS memberid, members.gamertag
FROM userprogress, members
WHERE userprogress.gamertagid = "' . $clanmitglied -> id . '" 
AND userprogress.gameid = "' . $game -> id . '
AND userprogress.gamertagid = members.id

Da sollte etwas passendes rauskommen.
 
Nochmals danke für deine Mühe. Leider verstehe ich von MySQL wirklich nicht viel. Und der Befehl funktioniert leider nicht.

Wenn ich es richtig interpretiere:
Code:
SELECT members.id AS memberid, members.gamertag
Angenommen $objTest = mysqlquery(), dann bekomme ich doch $objTest -> memberid und $objTest -> gamertag
Code:
FROM userprogress, members
Legt Fest aus welchen Spalten die Ergebnisse kommen.
Code:
WHERE userprogress.gamertagid = "' . $clanmitglied -> id . '" 
AND userprogress.gameid = "' . $game -> id . '
AND userprogress.gamertagid = members.id
gewöhnliche Bedingung, letztes verstehe ich nicht wirklich. Ich kann doch nicht 2 verschiedene Tabellen mit verschiedenen ID nicht wirklich vergleichen oder?

Vielleicht sollte ich noch eines erwähnen: gamertagid != memberid

Ich verknüpfe folgender Maßen:
Code:
userprogress.gamertagid = [gamertag.id | gamertag.userid] = member.id

Vielleicht hilft es den kompletten Code zu posten (passt halt nicht ganz zu Datenbanken):
PHP:
<?php
echo '<table width="100%" cellspacing="0">'."\n";
echo '<tr height="20">'."\n";
echo '<td width="80"><strong>Spielbild</strong></td>'."\n";
echo '<td width="160"><strong>Titel / Meisterwerk</strong></td>'."\n";
echo '<td><strong>Belohnungen</strong></td>'."\n";
echo '<td><strong>Folgende Clanmitglieder besitzen das Spiel</strong></td>'."\n";
echo '</tr>'."\n";
echo '<tr height="5" bgcolor="#CCCCCC"><td colspan="4"><span style="font-size:0px;">&nbsp;</span></td></tr>'."\n";
$clanmitglieder = $db -> select ('SELECT id FROM members WHERE Rechte > 1');
foreach ($clanmitglieder as $ClanMitglied) {
	if (isset ($sqlClanMember)) {
		$sqlClanMember .= ' OR userid = "' .$ClanMitglied -> id . '"';
	} else {
		$sqlClanMember = 'userid = "' . $ClanMitglied -> id . '"';
	}
}
$clanmitglieder = $db -> select ('SELECT * FROM gamertag WHERE ' . $sqlClanMember);
unset ($sqlClanMember);
$GameList = $db -> select ('SELECT * FROM games ORDER BY name');
$darkbg = false;
foreach ($GameList as $game) {
	if ($darkbg) {
		echo '<tr class="hovercolorA">'."\n";
		$darkbg = false;
	} else {
		echo '<tr class="hovercolorB">'."\n";
		$darkbg = true;
	}
	echo '<td width="85"><img src="' . $game -> image64 . '" width="64" height="64" style="border: 1px solid;margin:5px;" /></td>'."\n";
	echo '<td width="160">' . $game -> name . '</td>'."\n";
	echo '<td width="150">' . $game -> gamerscore . ' Gamerscore<br />' . $game -> achievements . ' Erfolge</td>'."\n";
	foreach ($clanmitglieder as $clanmitglied) {
		$count = $db -> count_rows ('SELECT id FROM userprogress
			WHERE gamertagid = "' . $clanmitglied -> id . '" AND gameid = "' . $game -> id . '"');
		if ($count > 0) {
			$MitgliedsDaten = $db -> select ('SELECT id, gamertag FROM members WHERE id = "' . $clanmitglied -> userid . '"', true);
			if (isset ($BesitzerLink)) {
				$BesitzerLink .= ', <a href="&id=' . $MitgliedsDaten -> id . '">' . $MitgliedsDaten -> gamertag . '</a>';
			} else {
				$BesitzerLink = '<a href="&id=' . $MitgliedsDaten -> id . '">' . $MitgliedsDaten -> gamertag . '</a>';
			}
		}
        /*$MitgliedsDaten = $db -> select ('SELECT members.id AS memberid, members.gamertag
			FROM userprogress, members
			WHERE userprogress.gamertagid = "' . $clanmitglied -> id . '" 
			AND userprogress.gameid = "' . $game -> id . '"
			AND userprogress.gamertagid = members.id
			', true);
        if (isset ($MitgliedsDaten -> id)) {
            if (isset ($BesitzerLink)) {
                $BesitzerLink .= ', <a href="&id=' . $MitgliedsDaten -> id . '">' . $MitgliedsDaten -> gamertag . '</a>';
            } else {
                $BesitzerLink = '<a href="&id=' . $MitgliedsDaten -> id . '">' . $MitgliedsDaten -> gamertag . '</a>';
            }
        }*/
	}
	if (!isset ($BesitzerLink)) {
		$BesitzerLink = '&nbsp;';
	}
	echo '<td>' . $BesitzerLink . '</td>'."\n";
	unset ($BesitzerLink);
	echo '</tr>'."\n";
}
echo '</table>'."\n";
?>


Ich fange am besten nochmal von vorne an:


Ich schreibe nochmal in Pseudosprache den Befehl auf, den ich gerne hätte:
Code:
IF ((COUNT_ROWS FROM `table1` WHERE col1 = 'value1' AND col2 = 'value2') > 0) THEN
	(SELECT col3, col4 FROM `table2, WHERE col5 = 'value3')
ELSE (SELECT NOTHING)

Angenommen objTest = mysql_fetch_object(), dann würde ich gerne einen der Folgenden Fälle haben:
PHP:
//Fall 1
if (isset (objTest -> col3)) //TRUE, 1
if (isset (objTest -> col4)) //TRUE, 1

//Fall 2
if (isset (objTest -> col3)) //FALSE, 0
if (isset (objTest -> col4)) //FALSE, 0
 
Zurück
Oben