Zur Navigation

sql abfrage [2]

11 Jörg Kruse

Hier fehlt die Verknüpfung zwischen zwei Bedingungen (in diesem Fall AND) und in der zweiten Bedingung fehlt das Datenfeld, auf welches sich das "LIKE 'maennlich '" bezieht:

WHERE turnierklasse = '2' LIKE 'maennlich '

LIKE bietet sich an, wenn der Begriff in dem Datenfeld enthalten sein soll - dann wären aber Wildcards sinnvoll. Die Bedingung "WHERE foo LIKE '%bar%'" passt z.B. auch den Wert 'abc_bar_xyz' im Datenfeld foo; bei einer Identität sollte stattdessen "=" verwendet werden. Kommt also darauf an, was für Werte in dem (nicht genannten) Datenfeld gespeichert sind.

28.05.2010 18:04 | geändert: 28.05.2010 18:05

12 tobi

in der tabelle gibt es mehrere felder, darunter auch das feld geschlecht.

bei den ganzen einträgen in der db, tauchen beim feld geschlecht nur männlich und weiblich auf

das mit LIKE war auch nur so eine idee

28.05.2010 18:45 | geändert: 28.05.2010 19:00

13 Jörg Kruse

bei den ganzen einträgen in der db, tauchen beim feld geschlecht nur männlich und weiblich auf

Dann wäre ein "AND geschlecht = 'männlich'" geeigneter

Das LIKE eignet sich eher für Suche nach Texten, in welchen ein bestimmtes Wort vorkommen soll.

28.05.2010 20:22

14 tobi

perfekt, danke

29.05.2010 01:22

15 tobi

So hab ein weiteres kleines Problemchen:
Die Abfrage und Ausgabe funktioniert soweit.
Ich lasse aus der Db einige werte auslesen, u.a. die Turnierklasse, welche in der Db mit der zahl 1 und 2 versehen ist.
Bei der Ausgabe kommt logischweise dann auch nur dieZzahl 1 und 2 unter der Turnierklasse zum Vorschein.

Kann ich beim Anzeigen irgendwie ändern, dass anstatt der Zahl 1 "D-Klasse" steht und bei der Zahl 2 "Damen B"?

$sql1 = "
SELECT id, nachname, vorname, verein, turnierklasse, timestamp FROM ppc_anmeldungen_samstag WHERE turnierklasse = '1' OR turnierklasse = '2' ORDER BY timestamp";

$db_erg1 = mysql_query( $sql1 );
if ( ! $db_erg1 )
{
die('Ungültige Abfrage: ' . mysql_error());
}

$anzahl = mysql_num_rows($db_erg1);

echo "Bisher sind " . $anzahl . " Meldung/en für diesen Wettbewerb bei uns eingegangen!";
echo "<br />";
echo "<br />";

echo "<center>";

echo "<table width=\"85%\" border=\"1\" cellpadding=\"3\" cellspacing=\"0\">";
echo "<tr>";
echo "<td></td>";
echo "<td>Name</td>";
echo "<td>Vorname</td>";
echo "<td>Verein</td>";
echo "<td>Turnierklasse</td>";
echo "<td>Meldedatum</td>";
echo "</tr>";

$anzahl = 1;
while ($zeile = mysql_fetch_array( $db_erg1, MYSQL_ASSOC))
{

echo "<tr>";
echo "<td>". $anzahl . "</td>";
echo "<td>". $zeile['nachname'] . "</td>";
echo "<td>". $zeile['vorname'] . "</td>";
echo "<td>". $zeile['verein'] . "</td>";
echo "<td>". $zeile['turnierklasse'] . "</td>";
echo "<td>" . date("d.m.Y G:i:s", strtotime($zeile['timestamp'])) . "</td>";
echo "</tr>";
$anzahl++;
}
echo "</table>";

echo "</center>";

mysql_free_result( $db_erg1 );

04.06.2010 02:35

16 Jörg Kruse

Hast du die Namen der Turierklassen in einer anderen Datenbanktabelle gespeichert?

04.06.2010 11:01

17 tobi

nee habe ich nicht.

aber wenn es nur so geht, dann werde ich eine tabelle mit den zahlen und den dazughörigen namen erstellen

und dann?

04.06.2010 12:07

18 Jörg Kruse

Dann kannst du mit einer JOIN Abfrage auch den Namen der Turnierklassen abfragen: Vorausgesetzt, die IDs der Turnierklassen in den beiden Tabellen entsprechen einander.

04.06.2010 23:23

19 tobi

ich habe mir nun mal http://aktuell.de.selfhtml.org/artikel/datenbanken/joins/#leftright_join angeschaut udn ein wenig experimentiert.

ob mein Versuch richtig ist, weiß ich nichi, außerdem bekomme ich eine Fehlermeldung:
Ungültige Abfrage: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN turnierklassen_samstag ON turnierklassen_samstag.id = ppc_anmeldungen_' at line 2

$sql1 = "
SELECT id, nachname, vorname, verein, turnierklasse, timestamp FROM ppc_anmeldungen_samstag WHERE turnierklasse = '1' OR turnierklasse = '2' 
LEFT JOIN turnierklassen_samstag ON turnierklassen_samstag.id = ppc_anmeldungen_samstag.turnierklasse
ORDER BY timestamp";



$db_erg1 = mysql_query( $sql1 );
if ( ! $db_erg1 )
{
die('Ungültige Abfrage: ' . mysql_error());
}

$anzahl = mysql_num_rows($db_erg1);

echo "Bisher sind " . $anzahl . " Meldung/en für diesen Wettbewerb bei uns eingegangen!";
echo "<br />";
echo "<br />";

echo "<center>";

echo "<table width=\"85%\" border=\"1\" cellpadding=\"3\" cellspacing=\"0\">";
echo "<tr>";
echo "<td></td>";
echo "<td>Name</td>";
echo "<td>Vorname</td>";
echo "<td>Verein</td>";
echo "<td>Turnierklasse</td>";
echo "<td>Meldedatum</td>";
echo "</tr>";

$anzahl = 1;
while ($zeile = mysql_fetch_array( $db_erg1, MYSQL_ASSOC))
{

echo "<tr>";
echo "<td>". $anzahl . "</td>";
echo "<td>". $zeile['nachname'] . "</td>";
echo "<td>". $zeile['vorname'] . "</td>";
echo "<td>". $zeile['verein'] . "</td>";
echo "<td>". $zeile['turnierklasse'] . "</td>";
echo "<td>" . date("d.m.Y G:i:s", strtotime($zeile['timestamp'])) . "</td>";
echo "</tr>";
$anzahl++;
}
echo "</table>";

echo "</center>";

mysql_free_result( $db_erg1 );

Tabelle 1 heißt: ppc_anmeldungen_samstag
Tabelle 2 heißt: turnierklassen_samstag

bei ppc_anmeldungen_samstag gibt es: id, nachname, vorname, verein, turnierklasse, timestamp
im Feld turnierklasse stehen die Zahlen 1-6

bei turnierklassen_samstag gibt es id, name
bei id stehen zahlen 1-6 und bei name, die unterschiedlichen turneirklassennamen

05.06.2010 02:16 | geändert: 05.06.2010 02:40

20 Jörg Kruse

Das LEFT JOIN muss direkt dem FROM statement folgen.

Dann müssen bei Namensgleichheit von Feldern (z.B. `id`) zur Unterscheidung die Tabelle angegeben werden.

Und bei der Auswahl möchtest du ja turnierklassen_samstag.name haben anstelle der ID :)

SELECT ppc_anmeldungen_samstag.id, nachname, vorname, verein, turnierklassen_samstag.name, timestamp
FROM ppc_anmeldungen_samstag
LEFT JOIN turnierklassen_samstag ON ppc_anmeldungen_samstag.turnierklasse = turnierklassen_samstag.id
WHERE turnierklasse = '1' OR turnierklasse = '2' 
ORDER BY timestamp

05.06.2010 10:26 | geändert: 05.06.2010 10:27