Tabelle 1 nach Tabelle 2 sortieren

resterampe

Mitglied
Hallo zusammen ich habe eine MySQL Datenbank

mit folgendem Aufbau (Auszug):

produkte_linien:
ID_P-L
FID_Linien
FID_Produkte

produkte:
ID_Produkte
Produktename
Produktnummer

bis jetzt frage ich die etwas ungeschickt mit folgendem Code ab:
Code:
<form action="" method="get">
<p><label for="txt1">Produkte:</label><br/>
<select id="txt1" onChange="showResult(this.value)">
 <option value="">Bitte Produkt w&auml;hlen</option>
<?php
//Abfrage Linien
$result = mysql_query ("SELECT * FROM produkte_linien WHERE FID_Linien = ".$_GET['linie'].";"); 
while ( $row = mysql_fetch_object($result) ) { 
 $result2 = mysql_query ("SELECT * FROM produkte WHERE ID_Produkte = '".$row->FID_Produkte."';");
 while ( $row2 = mysql_fetch_object($result2) ) {
  if (($row2->Produktnummer >= 1)&&($row2->Produktnummer <= 9)) { $Produktnummer = "00".$row2->Produktnummer; }
  elseif (($row2->Produktnummer >= 10)&&($row2->Produktnummer <= 99)) { $Produktnummer = "0".$row2->Produktnummer; }
  else { $Produktnummer = $row2->Produktnummer; }
  echo "<option value=\"".$_GET['linie']."||".$row2->ID_Produkte."\">".$Produktnummer." - ".utf8_encode($row2->Produktname)." (".$row2->Sollgewicht."gr)</option>\n"; 
 }
}
?>
</select></p>
</form>

nun möchte ich das Ergebnis von $result nach $result2 (Produktnummer) sortieren
und gleichzeitig den Code etwas schlanker machen.
dazu habe ich folgenden Ansatz mein $result gegen folgendes zu ersetzen, doch leider bis jetzt ohne Erfolg.

Code:
$result = mysql_query ("SELECT * FROM produkte_linien WHERE FID_Linien = ".$_GET['linie']." INNER JOIN produkte ON (produkte_linien.FID_Produkte = produkte.ID_Produkte) ORDER BY Produktnummer;");

Hat jemand eine schlaue Idee für mich? Es ist mein erster Versuch mit joins zu arbeiten.

Lieben Gruß
Resterampee
 
Dein Versuch sieht gar nicht mal so schlecht aus. Persönlich würde ich es mit einem linken Join versuchen, der dir die Bildung eines Kreuzprodukts aus beiden Tabellen prinzipiell erspart (Sofern die ON-Klausel nicht darauf abzielt).
Was genau schlägt an deinem Query denn fehl?

SQL:
SELECT
	`p`.`ID_Produkte`,
	`p`.`Produktename`,
	`p`.`Produktnummer`
FROM
	`produkte_linien` AS `l`
LEFT JOIN
	`produkte` AS `p` ON
	`l`.`FID_Produkte` = `p`.`ID_Produkte`
WHERE
	`l`.`FID_Linien` = '{$linien}'
ORDER BY
	`p`.`Produktnummer` ASC
;

Hierbei werden zuerst alle Linien ausgelesen, und anschließend werden die entsprechend dazu passenden Produkte links angefügt. Das heißt, dass es entweder genau einen Datensätze mit der entsprechenden Linie gibt, und die Produktinformationen sind leer (NULL), oder x Datensätze zu einer Linie, entsprechend der Anzahl von Produkten zu dieser Linie.

Eventuell ist das Datenbankschema verbesserbar, dazu benötige ich aber weitere Informationen, was genau wie geschrieben und verteilt wird.

PHP:
  if (($row2->Produktnummer >= 1)&&($row2->Produktnummer <= 9)) { $Produktnummer = "00".$row2->Produktnummer; }
  elseif (($row2->Produktnummer >= 10)&&($row2->Produktnummer <= 99)) { $Produktnummer = "0".$row2->Produktnummer; }
  else { $Produktnummer = $row2->Produktnummer; }

Man kann sich das Leben auch unnötig verkomplizieren ;)
PHP:
$produktnummer = sprintf( "%3u", $row['produktnummer'] );

Des Weiteren sollten keine übergebenen Parameter ohne Überprüfung und Sicherungsmaßnahmen (in deinem Fall wäre zB ein Casten nach Integer für die IDs sinnvoll,oder der Einsatz von [phpf]mysql_real_escape_string[/phpf]) verarbeitet werden. Das birgt die Gefahr von Querymanipulationen.
 
Guten Morgen maeTimmae,

Danke für Deine schnelle Antwort.

Es funktioniert einwandfrei...

Habe Deine beiden Vorschläge auch mal direkt mitumgesetzt - Danke für die Tipps

nur dass

Code:
$produktnummer = sprintf( "%3u", $row['produktnummer'] );

die führenden nullen entfernt, die ich aber gerne hätte.

Anbei noch ein SQL-Dump.
Ich hoffe er hat die Verknüpfungen auch mit exportiert.

Gruß resterampe
 

Anhänge

Zuletzt bearbeitet:
Code:
$produktnummer = sprintf( "%3u", $row['produktnummer'] );

die führenden nullen entfernt, die ich aber gerne hätte.
Entschuldige, da waren der Geist den Fingern voraus. Korrekt müsste es natürlich
PHP:
sprintf( "%03u", $value );
lauten.

Anbei noch ein SQL-Dump.
Ich hoffe er hat die Verknüpfungen auch mit exportiert.
MyISAM unterstützt leider keine Foreign Keys, die Tabellen sind aber kurz und prägnant kommentiert. Nun macht es auch für mich Sinn - Bin zuvor nicht davon ausgegangen, dass ein Produkt mehreren Linien zugeordnet werden könnte, in sofern ist das eine sehr saubere Lösung, mit der du da arbeitest. Lediglich die Spaltenbezeichnungen sind eher ungünstig gewählt, wie ich finde. Habe mir früh angewöhnt, diese komplett in kleinen Lettern sowie möglichst im Singular zu halten, und mit Unterstrichen die Relationen untereinander (gilt für Tabellen und Spalten gleichermaßen) darzustellen, wobei die natürlichen Spalten einer Tabelle (also keine Indizies auf andere Tabellen, etc) keinen Präfix erhalten. Und sowas wie `W_001` ist natürlich Geschmackssache, arbeiten wollen würde ich damit aber nicht so gerne, wenn es nicht wirklich sein müsste. ;)
 
P_001 und W_001 ist natürlich nicht meine liebste Lösung, wobei mir keine andere eingefallen...
Jede Maschine hat halt unterschiedlich viele Parameter mit unterschiedlichen Bezeichnungen...

bin für Gegenvorschläge sehr dankbar

ansonsten werde ich wohl erst Dienstag wieder online sein :)

Frohe Pfingsten
 
Hey resterampe!

Die wohl einfachste Lösung dafür wäre eine Tabelle diesen Formats:
SQL:
CREATE TABLE `parameter` (
	`id`			INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`produkt_id`	INT(10) UNSIGNED NOT NULL,
	`name`			VARCHAR(100) NOT NULL,
	`value`			VARCHAR(255) NOT NULL,
	PRIMARY KEY		( `id` ),
	INDEX			( `produkt_id` ),
	UNIQUE			( `produkt_id`,`name` )
);

Über produkt_id referenzierst du auf ein Produkt. Für ein Produkt kann es mehrere Parameter geben (als Zucker habe ich einfach mal per Definition ausgeschlossen, dass ein Produkt zwei Parameter gleichen Namens abbekommen kann), so ersparst du dir mindestens einen Join, und hast dazu auch noch einen direkten Überblick, was wie heißt und mit welchem Wert und Produkt verbunden ist. Die ID ist so betrachtet sogar unnötig, da man über produkt_id und name indexieren kann...

Hoffe, das es gut verständlich ist. :)

Dir ebenfalls ein angenehmes, leicht verlängertes Wochenende!
 
Guten Morgen,

Ich hoffe Du hattest ein schönes verlängertes Wochenende.
Deine Lösung ist schon sehr fein, da ich aber auch die "alten" Parameter als Historie speichern möchte/muss, brauche ich die Möglichkeit einem Produkt mehrmals einen Parameter zuordnen zu können. Deswegen auch der TimeStamp in den Parameterwerten...


LG
Resterampe
 
Zurück