SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Bash, Shell, PHP, Python, Perl, CGI
fulltilt
Posts: 363
Joined: 2006-08-27 02:06

SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-03 13:07

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"

User avatar
Joe User
Project Manager
Project Manager
Posts: 11604
Joined: 2003-02-27 01:00
Location: Hamburg

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by Joe User » 2008-10-03 14:59

Du suchst: JOIN, GROUP BY und LIMIT
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-03 15:10

Joe User wrote:Du suchst: JOIN, GROUP BY und LIMIT


Danke für den Tip - werde mal versuchen das zusammen zu bekommen :-)

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-03 19:22

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>';
}

?>

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-04 12:53

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>';

}

?>

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-04 19:21

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?

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-04 21:41

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)

User avatar
Joe User
Project Manager
Project Manager
Posts: 11604
Joined: 2003-02-27 01:00
Location: Hamburg

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by Joe User » 2008-10-04 21:52

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...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-05 11:26

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

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-05 16:58

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>';

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-06 10:31

Klappt jetzt - habe das ganze in eine Tabelle gesetzt.
Danke für die Geduld :-)

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-23 13:11

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?

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by daemotron » 2008-10-23 13:21

Wenn das eine sortierte Spalte ist, dann SORT ASC gegen SORT DESC austauschen.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-23 13:33

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

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by daemotron » 2008-10-23 13:37

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.

apr
Posts: 16
Joined: 2007-05-15 11:19

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by apr » 2008-10-23 15:00

Code: Select all

UPDATE `table` SET 
   `feld` = CONCAT( 
      RIGHT(
         `feld`, LOCATE( " ", `feld` ) - 1
         ),
      " ",
      LEFT(
         `feld`, LENGTH(`feld`) - LOCATE( " ", `feld` )
         )
      );

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: SELECT Abfrage über 2 Tables nach ID und Zeilen auslassen

Post by fulltilt » 2008-10-23 15:10

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` )
         )
      );