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

while schleife / Doppelabfrage

Status
Für weitere Antworten geschlossen.

Joli

Neues Mitglied
Hi zusammen,
ich hab ein prob :-(

und zwar habe ich eine Nummernliste, in den User eingetragen sind. Die User werden fortlaufend gezählt, also 1. User => 1 usw. Jeder User kann wenn er will sich eine Wunschnummer wünschen, muss aber nicht. Jetzt will ich eine Offizielle Liste ausgeben und eine Wunschnummernliste, wobei bei der Wunschliste die Lücken zb. zwischen 2 und 5 (3 und 4 wurde nicht gewünscht) durch die User gefüllt werden die keine Wunschnummer haben. Sprich User 1 bekommt die Wunschnummer 1 zugeteilt, User 2 bekommt die 3 zugeteilt, da es die 2. Lücke ist. Alle noch nicht gewünschten Nummern können, noch von späteren Usern gewünscht werden, das heist die Liste muss immer neu generiert werden und die User, die keine Wunschnummer haben, bekommen mit der Zeit unterschiedliche Wunschnummern zugeteilt.
Ich hoff ihr kapiert was ich meine^^
achja alle User sind in einer DB gespeichert (id, nr, user, wunschnr)
Jetzt zu meinen Problem...

mit einer Abfrage finde ich alle User heraus die eine Wunschnummer haben
mit einer weiteren die restl. ohne Wunschnummer (WHERE wunschnr = 0)

JEtzt müsste ich aber sozusagen beide abfragen wie ein Reisverschluss zu einer liste zusammenführen...
hab schon diverse Sachen ausprobiert, funktioniert aber immer nicht, da ich ja zwei whileschleifen habe und ich diesse dann theoretisch kurz unterbrechen müsste und später fortfuhren muss...

Ich hab bei einem Praktikum mal was mit 2-in-1 Abfrage gemacht (hier könnte ich meine beiden Abfragen in eine Schleife (eine whileschleife) zusammenassen)... weis aber nicht mehr wie das geht bzw. ob mir das weiterhilft.
Ich hoff jemand von euch hat eine Idee wie ich dies realisieren kann.

Danke shconmal
 
Werbung:
Hallo,

Du fängst an, von 1 zu zählen (Schleife). Immer wenn die Nummer keiner Wunschnummer zugeordnet ist, wird einer aus der Liste ohne Wunschnummer genommen, sonst die Wnschnummer :-) Wenn die Liste ohne Wunschnummer leer ist, die Ausgabe um die restlichen Wunschnummern ergänzen. Ansonsten ist Ende, wenn beide Listen leer sind.

Optimierungen:
1. Die Liste mit Wunschnummern wird nach der Nummer sortiert, um einfach die nächste Nummer bestimmen zu können.
2. Die Ausgabe der Wunschnummernliste nach Ende der Wunschnummernlosenliste sollte nicht anhand einer hochzählenden Zahl sondern einfach mit der Ausgabe der restlichen Einträge der Liste erfolgen

Gruß,
Jumper, the II.
 
schon mal danke für die antwort...
wie du geschildert hast, müsste man eine doppelabfrage nehmen also beides in einem... weil man kann ja nicht von einer while in die nächste gehn und dann widda zurück...

aber ich hab glaub ich die lösung schon fast geschafft.

bin immer noch für weitere ideen offen

wenn cih es selber geschafft haben sollte, poste ich natürlich meine lösung:)

################################################

so meine vorläufige lösung:



PHP:
<table>
<tr>
	<td>Nr.</td>
	<td>User</td>
	<td><b>Wunschnr.</b></td>
	<td>Gewünscht?</td>
</tr>
<?
$query3 = "SELECT wunschnr FROM user ORDER BY wunschnr DESC LIMIT 0,1";
$sql3 = mysql_query($query3);
$ds3 = mysql_fetch_object($sql3);
$dl = $ds3->wunschnr;
$i = 1;
$wunschc = 0; //zähler für die wunschlisten schleife
$offc = 0; //zähler für die offizielle Listen schleife
$while = 0; 
while($while <= $dl) {
$query = "SELECT * FROM user WHERE wunschnr != '0' ORDER BY wunschnr LIMIT $wunschc, $anzahl";
$sql = mysql_query($query);
while($ds = mysql_fetch_object($sql)) {
	$wunschnr = $ds->wunschnr;
	$diff = $wunschnr - $i;
	if($i == $wunschnr) {
		$nr = $ds->nr;
		$name = $ds->name;
		$gewunscht = $ds->gewunscht;
		?>
		<tr>
			<td><?= $nr ?>.)</td>
			<td><?= $name ?></td>
			<td><b><?= $wunschnr ?></b></td>
			<td><?= $gewunscht ?></td>
		</tr>
		<?
		$i++;
		$wunschc++;
	}
	else break;
}
$query2 = "SELECT * FROM user WHERE wunschnr = '0' ORDER BY nr LIMIT $offc, $diff";
$sql2 = mysql_query($query2);
while($ds2 =  mysql_fetch_object($sql2)) {
	$name2 = $ds2->name;
	$nr2 = $ds2->nr;
	$wunschnr2 = $ds2->wunschnr;
	$gewunscht2 = $ds2->gewunscht;
	?>
	<tr>
		<td><?= $nr2 ?>.)</td>
		<td><?= $name2 ?></td>
		<td><b><?= $i ?></b></td>
		<td><?= $gewunscht2 ?></td>
	</tr>
	<?
	$i++;
	$offc++;
}
$while++;
}
?>
</table>

mein problem liegt jetzt darin wie ich die restl. Datensätze aus der Wunschlistenabfrage ausgeben kann...
Dazu muss der Code iwie erkennen das die Offizielle Nummernliste leer ist und das dann in der Wunschschleife alle restl. datensätze ausgegeben werden...
hab schon probiert mit
PHP:
if(mysql_fetch_object($sql2) == false) $rest = 1;
else $rest = 0;

aber das geht nciht, da ja die offizielle nummernlistenschleife nicht nur beim letzten mal false angibt sondern auch die male davor wo sie fertig ist....
 
Zuletzt bearbeitet:
Werbung:
also hat zwar nichts mit dem thema zu tun aber naja... hab da mal ne frage...

warum benutzt du mysql_fetch_object? wenn dir auf diese frage kein guter grund einfällt außer, "sieht einfach geiler aus" oder "so siehts aus als wenn ich php kann", benutze bitte mysql_fetch_assoc und erst wenn du wirklich mit der OO Programmierung anfängst darfst du dran denken mysql_fetch_object wieder zu verwenden. ;)

//Edit: heir nochmal dein zweiter code n bissel verbessert ^^
PHP:
$rest = (mysql_fetch_object($sql2) == false);
 
Hallo,

ich war eigentlich eher von so einer Abfrage ausgegangen:
PHP:
<?php
$qNotNull = "SELECT * FROM user WHERE wunschnr!=0 ORDER BY wunschnr";
$qNull    = "SELECT * FROM user WHERE wunschnr=0 ORDER BY name";

$rsrcNotNull = mysql_query( $qNotNull);
$rsrcNull = mysql_query( $qNull);

$rsltNotNull = mysql_fetch_assoc( $rsrcNotNull);
$rsltNull = mysql_fetch_assoc( $rsrcNull);



$nr = 1;

while( ($rsltNull !== FALSE) || ($rsltNotNull !== FALSE)) {
  // 0 = nicht definiert
  // 1 = wunschnummer
  // 2 = nichtwunschnummer
  $selectOut = 0;


  if( $rsltNull === FALSE) {
    // Sonderfall - Liste der Nutzer ohne Wunschnummern ist alle
    $nr = $rsltNotNull['wunschnr'];
    $SelectOut = 1;
  }
  else if( $rsltNotNull === FALSE) {
    // Sonderfall - Liste der Nutzer mit Wunschnummern ist alle
    $SelectOut = 2;
  }
  else {
    // Standard-Fall - Vergleich
    if( $rsltNotNull['wunschnr'] == $nr) {
      // Wunschnummer liegt vor
      $SelectOut = 1;
    }
    else {
      $SelectOut = 2;
    }
  }  

  // Ausgabe
  if( $SelectOut == 1) {
    // Wunschnummer
    ?> 
    <tr> 
        <td><?php echo "".$rsltNotNull['nr'];        ?>.)</td> 
        <td><?php echo "".$rsltNotNull['name'];      ?></td> 
        <td><b><?php echo "".$nr;                     ?></b></td> 
        <td><?php echo "".$rsltNotNull['gewunscht']; ?></td> 
    </tr> 
    <?php
    // nächster Eintrag
    $rsltNotNull = mysql_fetch_assoc( $rsrcNotNull); 
  }
  else if( $SelectOut == 2) {
    // ohne Wunschnummer
    ?> 
    <tr> 
        <td><?php echo "".$rsltNull['nr']         ?>.)</td> 
        <td><?php echo "".$rsltNull['name'];      ?></td> 
        <td><b><?php echo "".$nr;                  ?></b></td> 
        <td><?php echo "".$rsltNull['gewunscht']; ?></td> 
    </tr> 
    <?php
    // nächster Eintrag
    $rsltNull = mysql_fetch_assoc( $rsrcNull); 
  }
  else {
    // Sicherheitsabfrage für die Wahlfunktion
    die( 'Fehler in der Verarbeitung .. $SelectOne besitzt einen unerwarteten Wert');
  }

  $nr += 1;
}
?>

also 2 Queues aufbauen, eine mit Wunschnummer (NotNull) und eine ohne (Null), und dann parallel verarbeiten. Bei der Verarbeitung wird nach einer strengen Regel jeweils von links oder von rechts genommen:
1. Wenn die Liste der Wunschnummern alle ist, nimm die Nummer mit einer von den Ohne ....
2. Wenn die Liste der Wunschnummernfreien alle ist, setzte die Nummer auf die nächste Wunschnummer (!) und nimm den nächsten von den mit Wunschnummern
3. wenn die Nummer mit der Wunschnummer des aktuellen Eintrags übereinstimmt, nimm den eintrag von der Wunschnummerliste, ansonsten von der ohne

2. Regelwerk
Immer, wenn du von einer Liste einen Eintrag ausgibst, hole den nächsten EIntrag aus dieser Liste!

Gruß,
Jumper, the II.
 
Zuletzt bearbeitet:
also hat zwar nichts mit dem thema zu tun aber naja... hab da mal ne frage...

warum benutzt du mysql_fetch_object? wenn dir auf diese frage kein guter grund einfällt außer, "sieht einfach geiler aus" oder "so siehts aus als wenn ich php kann", benutze bitte mysql_fetch_assoc und erst wenn du wirklich mit der OO Programmierung anfängst darfst du dran denken mysql_fetch_object wieder zu verwenden. ;)

liegt vllt. daran, dass ich es mit mysql_fetch_object gelernt habe und dann einfach dabei geblieben bin :wink:


@jumper
danke dir funktioniert...
hab es aber erst nachdem 2. mal kapiert :wink:
lag vllt. am nicht vollständigen highlighting
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben