[PHP + MySQL] 2 SQL-Anweisungen zu einer zusammenfassen

BadKiss

Mitglied
Huhu :)

Ich hab mal wieder ein kleines Problem.
Sicherlich ist das ganz einfach zu lösen, doch ich krieg es irgendwie einfach nicht gebacken ^^'

Ich habe folgenden Code:
PHP:
$sql_m1 = "SELECT *
           FROM member_cards
           WHERE member_cards_member_id = ".$_SESSION['member_id']."
             AND member_cards_cat = 2
           GROUP BY member_cards_sets_id";
$result_m1 = mysql_query($sql_m1) OR die(mysql_error());
$anz_m1 = mysql_num_rows($result_m1);
if($anz_m1) {
  echo 'Klicke auf die <b>Mastercard</b>, um das Deck zu mastern!<br />';
  echo '<div class="masterable" style="position:relative;float:left;width:694px;padding-left:45px;margin-top:5px;padding-top:5px;padding-bottom:5px;margin-bottom:20px;border:1px dashed;">';
  while($row_m1 = mysql_fetch_assoc($result_m1)) {
    $sql_m2 = "SELECT *
               FROM member_cards, sets
               WHERE member_cards_member_id = ".$_SESSION['member_id']."
                AND member_cards_cat = 2
                AND member_cards_sets_id = ".$row_m1['member_cards_sets_id']."
                AND member_cards_sets_id = sets_id
               ORDER BY sets_name";
    $result_m2 = mysql_query($sql_m2) OR die(mysql_error());
    $row_m2 = mysql_fetch_assoc($result_m2);
    $anz_m2 = mysql_num_rows($result_m2);
    if(($anz_m2 == 12 && $row_m2['sets_cat'] != 13) || ($anz_m2 == 24 && $row_m2['sets_cat'] == 13)) {
      //echo '<div class="masterable">'.$row_m2['sets_name'].' masterbar <br /></div>';

      // Klick 4 Master
      echo '<div style="position:relative;float:left;width:126px;height:82px;padding:2px;">
							<form action="userarea.php?what=master&set='.$row_m2['member_cards_sets_id'].'" method="post">';
			  echo '<input type="submit" name="submit" value=""
							style="background-image:url(http://test.whispering-secrets.org/'.$row_m2['sets_name'].',master.gif);width:126px;height:82px;border:0px;background-color:#ffffff;" />';
				echo '</form>
						</div>';
    }
  }
  echo '</div>';
  echo '<br />';
}

Ich würde es allerdings gern so machen, dass diese Box (der Div-Container "masterable") nur dann erscheint, wenn der 2. Query denn ausgeführt wird.

Also ich würde gern beide Query's zu einem zusammenfassen.
Hab es schon mit Joins, Union und Subselects versucht, aber irgenwas mach ich wohl immer falsch ^^'

Im Grunde genommen soll folgendes passieren:

Man hat mehrere Karten von verschiedenen Decks (1 Deck besteht aus 12 bzw 24 Karten).
Wenn man jetzt 12 Karten des selben Decks besitzt, soll diese Box mit einer anderen Karte auftauchen, ansonsten soll nichts angezeigt werden.

Ich hoffe, man versteht, was ich machen will ^^'
Und dass mir jemand helfen kann :)

Greetz,
BadKiss
 
Sorry, hab grad keine Lust dein ganzer Code durchzugehen um das zu verstehen. Reduziere das ganze auf das Problem. Schreib etwas zur Tabellenstruktur und was du ausgeben willst (technisch! Ob es sich um Karten oder Äpfel handelt ist eigentlich egal)

Was hat es mit der mamber_cards_set_id auf sich, was mit der mit member_card_cat? Was bringt der GROUP BY auf mamber_cards_set_id? etc.
 
Morgen

bei deinem ersten if nach dem ersten Query brauchst du noch eine Bedingung.
PHP:
if($anz_m1 == Bedingung){Ausführung}

Ansonsten wenn du 2 Querys aufeinmal abschicken willlst musst du dich mit mysqli beschäftigen. Da geht es.
 
@yaslaw:
Anbei mal die Tabellenstrukturen und jeweils 2 Beispieldatensätze.

Die member_cards_sets_id der Tabelle member_cards ist mit der sets_id von der Tabelle sets verbunden.
member_cards_cat bezeichnet die Kategorie, in welcher sich die Karte befindet.
2 = Collect
3 = Will
..
Es gibt bis zu 6 Kategorien.

Das group by sollte mir die doppelten Datensätze zusammenfassen, wenn zb eben das Set mit der ID 116 mehrmals auftaucht, dann soll dies zu einem Datensatz zusammengefasst werden, damit ich in der 2. SQL-Anweisung nur explizit auf dieses Set zugreifen kann.


@Kalito:
Ok, dann guck ich mir mal mysqli an, eventuell hilft mir das ja weiter :)
Danke für eure Hilfe.
 

Anhänge

  • tabelle_membercards.png
    tabelle_membercards.png
    7,3 KB · Aufrufe: 8
  • tabelle_sets.png
    tabelle_sets.png
    11,1 KB · Aufrufe: 8
  • beispieldatensatz_member_cards.png
    beispieldatensatz_member_cards.png
    2,4 KB · Aufrufe: 5
  • beispieldatensatz_sets.png
    beispieldatensatz_sets.png
    4,6 KB · Aufrufe: 4
item: Beim ersten Query unbedingt das * durch member_cards_sets_id ersetzen. Das GROUP BY kann man durch DISTINCT ersetzen:
SQL:
SELECT DISTINCT 
	member_cards_sets_id
FROM 
	member_cards
WHERE
	member_cards_member_id = ".$_SESSION['member_id']."
	AND member_cards_cat = 2

item: Wenn du jetzt alles in einem machen willst, dann muss man sich überlegen was man braucht. Da du im 2ten Query nur die erste Zeile ausliest, geh ich mal davon aus, dass du nur die Infos über das Kartenset haben willst. Du zählst aber noch die Anzahl Karten, ergo brauchst du das auch noch. Infos übers Set + Anzahl Karten pro Set.
Dass kannst du mit einem geschickten GROUP BY machen. Wenn du noch sicher sein willst, das jede Karte nur einmal gezählt wird, dann geht das über ein COUNT(DISTINCT eindeutigesFeld). In deinem Fall wahrscheinlich die member_cards_id
SQL:
SELECT
	sets_cat,
	member_cards_sets_id,
	sets_name,
	COUNT(DISTINCT member_cards_id) AS anz_cards_in_set
FROM 
	member_cards
	INNER JOIN sets
		ON member_cards_sets_id = sets_id
WHERE
	member_cards_member_id = {$_SESSION['member_id']}
	AND member_cards_cat = 2
GROUP BY
	sets_cat,
	member_cards_sets_id,
	sets_name	
ORDER BY 
	sets_name

Diese kannst du dann etwa so auswerten
PHP:
//TODO: $sql = siehe oben
$result = mysql_query($sql) OR die(mysql_error());
if(mysql_num_rows($result)) {
  echo 'Klicke auf die <b>Mastercard</b>, um das Deck zu mastern!<br />';
  while($row = mysql_fetch_assoc($result)) {
    if(($row['anz_cards_in_set'] == 12 && $row['sets_cat'] != 13) || ($row['anz_cards_in_set'] == 24 && $row['sets_cat'] == 13)) {
		//TODO: echo blablabla    
	}
  }
}

Das ganze ist wie immer ungeprüft, der Rechtsweg ist ausgeschlossen und sie gehen nicht über Start und erhalten keine 4000 Franken. Zu Riskien und Nebenwirkungen fragen sie ihren Arzt oder Apotheker.
 
Zuletzt bearbeitet von einem Moderator:
Dankeschön!
So klappt das einwandfrei und ist total schnell <3
Ein ganz großes Danke :)

EDIT: Mist, Komando zurück, funktioniert leider doch noch nicht so ganz, wie es soll =/
Ich hab einen Aspekt vergessen: Wenn in der member_cards_cat = 2 weitere Karten vorhanden sind, allerdings keine 12 bzw 24, dann wird mir das leider immer noch ausgegeben.
Hmm, da muss ich wohl doch nochmal weiter gucken, aber trotzdem bisher danke :)
 
Zuletzt bearbeitet:
Zurück