Page 1 of 1
SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-03 13:07
by fulltilt
Wie kann ich eine Abfrage ausführen über 2 Tabellen nach ID geordnet und in der zweiten Tabelle z.B. field_id 5, 6, 9 rauslassen?
Die Standard Abfrage sieht so aus und soll erweitert werden wie unten:
Code: Select all
<?php
$SelectQuery = "SELECT fullname FROM jos_events_registrations;";
$SelectQueryResult = mysql_query($SelectQuery) OR die(mysql_error());
while($row = mysql_fetch_assoc($SelectQueryResult))
{
echo $row['fullname']. '<br>';
}
?>
Es soll zusätzlich von der Tabelle "jos_events_registration_fields_values" nach "registration_id" geordnet die Spalte "value" ausgelesen werden - allerdings nur die Zeilen 1, 2, 3 aus der Spalte "field_id"
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-03 14:59
by Joe User
Du suchst: JOIN, GROUP BY und LIMIT
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-03 15:10
by fulltilt
Joe User wrote:Du suchst: JOIN, GROUP BY und LIMIT
Danke für den Tip - werde mal versuchen das zusammen zu bekommen :-)
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-03 19:22
by fulltilt
Hm - habe hier noch das Problem das ich für "b.value" noch 3 weitere Zeilen auslesen muss z.B. '5', '7', '9'
kann ich diese so einfügen und ist der untere Teil richtig so?
WHERE b.value='4, 5, 7, 9';";
Code: Select all
<?php
$SelectQuery = "SELECT a.fullname, a.registration_id, b.registration_id, b.value
FROM jos_events_registrations LEFT JOIN jos_events_registration_fields_values ON a.registration_id=b.registration_id WHERE b.value='4';";
$SelectQueryResult = mysql_query($SelectQuery) OR die(mysql_error());
while($row = mysql_fetch_assoc($SelectQueryResult))
{
echo $row['a.fullname']. '<br>';
echo $row['4']. '<br>';
echo $row['5']. '<br>';
echo $row['7']. '<br>';
echo $row['9']. '<br>';
echo '<br>';
}
?>
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-04 12:53
by fulltilt
Danke - habe die Abfrage nun hinbekommen, allerdings muss ich weitere field_id s ausgeben - momnetan wird nur fullname und 16 ausgegeben. Es sollen field_id 9,10,11,12 noch mit ausgelesen werden und in der Ausgabe "value" untereinander angeordnet werden. Wie kann ich das am besten hierbei umsetzen?
Code: Select all
$SelectQuery ="
SELECT
jos_events_registrations.registration_id, fullname, jos_events_registration_fields_values.registration_id, field_id, value
FROM
jos_events_registrations
LEFT JOIN
jos_events_registration_fields_values ON jos_events_registrations.registration_id = jos_events_registration_fields_values.registration_id AND field_id = ('16')
GROUP BY
jos_events_registrations.registration_id
;";
$SelectQueryResult = mysql_query($SelectQuery) OR die(mysql_error());
while($row = mysql_fetch_assoc($SelectQueryResult))
{
echo 'Name: '.$row['fullname']. '<br>';
echo 'Company: '.$row['value']. '<br>';
echo '<br>';
}
?>
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-04 19:21
by fulltilt
Komme hier nicht mehr weiter, beim obigen Post gibt er mir nur eine Zeile raus ...
Habe auch mal mit UNIT versucht - dabei gibt er alles aus und komplett durcheinander:
Code: Select all
$SelectQuery ="SELECT registration_id, session_id, fullname FROM jos_events_registrations UNION SELECT registration_id, field_id, value FROM jos_events_registration_fields_values ;";
Die Inhalte aus den values stehen leider in einer Spalte untereinander und der Username ist in der anderen Tabelle - beide haben aber eine gemeinsame registration_id ...
Das Problem dabei ist, das ich von den values (Zeilen) der zweiten Tabelle nur bestimmte ausgeben will diese haben auch jeweils eine field_id ...
Hat noch jemand eine Idee?
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-04 21:41
by fulltilt
Basics - genau :-)
gibt es denn nicht eine Möglichkeit nach "AND field_id = 16"
weitere IDs anzuhängen und mit einem Break und Titel untereinander auszugeben?
so was in etwa ...
Code: Select all
AND 'Titel:' (field_id = 10) '<br>',
AND 'Titel2:' (field_id = 11)
AND (field_id = 12)
AND (field_id = 13)
AND (field_id = 14)
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-04 21:52
by Joe User
Scripting-Basics: Trenne Code und Markup.
Mit anderen Worten: Zuerst die Datenbank abfragen und danach das Ergebnis weiterverarbeiten und erst zum Schluss ausgeben. Schaue Dir mal andere umfangreichere PHP-Scripts an, beispielsweise phpBB3. Dort kannst Du einiges lernen...
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-05 11:26
by fulltilt
Danke Matthias,
Das Query funktioniert ja an sich, es muss nur über den zweiten Parameter "value" die gewünschten Zeilen auslesen. Die Tabelle wurde ziemlich ungünstig erstellt ... die jeweiligen Feldinhalte liegen nicht in einer Spalte sondern durcheinander in Zeilen mit einer field_id für das entsprechende Feld - also 10 steht z.B. für Company ...
Habe hier noch etwas entdeckt: GROUP_CONCAT
ist es damit möglich eine WHERE Abfrage zu machen welche alle gleichen IDs verbindet?
z.B.
WHERE field_id = same (was müsste ich anstatt "same" nehmen)?
Code: Select all
SELECT P.Post_ID, P.Title,
GROUP_CONCAT(T.Tag SEPARATOR ', ') AS Tags
FROM Blog_Posts P
JOIN Blog_Tags T ON P.Post_ID = T.Post_ID
WHERE P.Post_ID = 1
GROUP BY P.Post_ID, P.Title
Muss mich in nächster Zeit unbedingt intensiver in die Materie einlesen :-)
matzewe01 wrote:
Schau dir mal eine for case Regel an.
Ebenfalls Mysql funktionen.
Aber so willst Du das nicht lösen Joe User hat es Dir ja schon gesagt.
Du kannst Dir jedoch die Daten sortiert ausgeben lassen. order by field_id. z.B.
Bei der späteren Auswertung prüfst Du, ob es noch id 11, 12 oder 13 ist und erstellst bei einer Wertänderung eine Überschrift Zeile z.B.
Die Verarbeitung der Daten erfolgt jedoch nach dem select. Zum select kannst Du die Daten aber schon otimal für Dich vorbereiten, sortieren filtern etc.
Gruss Matthias
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-05 16:58
by fulltilt
Habe das ganze jetzt hinbekommen, allerdings müsste ich nach dem ersten Result eine Leerzeile haben - wie kann ich das hierbei hinbekommen?
Unten bei der echo Ausgabe klappt es nicht, wenn ich noch ein <br> einfüge, sind alle Zeilen davon betroffen - es soll nur eine Leerzeile nach der ersten Ausgabe erfolgen ...
Code: Select all
$SelectQuery ="
SELECT registration_id, fullname FROM jos_events_registrations
UNION SELECT registration_id, value
FROM jos_events_registration_fields_values
WHERE field_id = '16' OR field_id = '10' OR field_id = '7' OR field_id = '9' OR field_id = '10' OR field_id = '11' OR field_id = '12'
ORDER BY registration_id DESC;";
$SelectQueryResult = mysql_query($SelectQuery) OR die(mysql_error());
while($row = mysql_fetch_assoc($SelectQueryResult))
{
echo $row['fullname']. '';
echo $row['value']. '<br>';
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-06 10:31
by fulltilt
Klappt jetzt - habe das ganze in eine Tabelle gesetzt.
Danke für die Geduld :-)
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-23 13:11
by fulltilt
Gibt es eine Möglichkeit in einer Spalte einen Wert umzudrehen?
z.B. in der Zeile steht:
Wort1 Wort2
das soll nachher dann werden:
Wort2 Wort1
Kann man hier einen SQL Befehl auf die ganze Spalte anwenden der alles quasi umdreht?
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-23 13:21
by daemotron
Wenn das eine sortierte Spalte ist, dann SORT ASC gegen SORT DESC austauschen.
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-23 13:33
by fulltilt
jfreund wrote:Wenn das eine sortierte Spalte ist, dann SORT ASC gegen SORT DESC austauschen.
Danke versuche ich mal - einige Daten sollen nur aufbereitet werden und in eine andere DB migriert werden ... muss nur die Inhalte dieser Spalte (600 Zeilen) drehen, danach wird die Datenbank nicht mehr gebraucht - kann also hier radikal vorgehen :-)
Es stehen überall 2 Worte drin die nachher vertauscht sein sollen A B > B A
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-23 13:37
by daemotron
Ach so, Du willst den Inhalt einer Spalte ändern. Das kriegst Du mit Sort natürlich nicht hin. Bei PostgreSQL hätte ich jetzt PL/Perl vorgeschlagen, aber bei MySQL würde ich sagen, nimm ein Shell- oder PHP-Skript, das die Daten ausliest, vertauscht und dann ein Update macht.
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-23 15:00
by apr
Code: Select all
UPDATE `table` SET
`feld` = CONCAT(
RIGHT(
`feld`, LOCATE( " ", `feld` ) - 1
),
" ",
LEFT(
`feld`, LENGTH(`feld`) - LOCATE( " ", `feld` )
)
);
Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen
Posted: 2008-10-23 15:10
by fulltilt
Das sieht gut aus - Danke :-)
apr wrote:Code: Select all
UPDATE `table` SET
`feld` = CONCAT(
RIGHT(
`feld`, LOCATE( " ", `feld` ) - 1
),
" ",
LEFT(
`feld`, LENGTH(`feld`) - LOCATE( " ", `feld` )
)
);