2016-08-07 6 views
-1

Ich habe einige Probleme zu verstehen, wie ich meine 1 zu viele PHP-Abfrage korrekt ausgeführt werden.One to Many PHP-Abfrage

Zur Zeit habe ich 2 Tabellen in MySQL-Datenbank

  • DELI_ITEMS [Ingredient_Type, itemname]
  • DELI_ITEMS_QUANTITY [Ingredient_Type, Anzahl]

Ich habe eine MySQL-Abfrage wie folgt aus:

$sql_deli_meat="SELECT * FROM deli_items,deli_items_quantity WHERE ingredient_type = 'deli_meat' ORDER BY sort ASC"; 

PHP Abfrage

<?php while($rows=mysql_fetch_array($result_deli_meat)){ ?> 

     <input type="checkbox" name="deli_meat[]" id="<? echo $rows['itemname']; ?>" value="<? echo $rows['label']; ?>"/> 

     <select name="deli_meat[]"> 
     <option value="<? echo $rows['qty']; ?>"><? echo $rows['qty']; ?></option> 
     </select> 


    <?php } ?> 

Ich versuche jedes Kontrollkästchen Eingabe von zurück zu bekommen DELI_ITEMS die Menge Elemente aus DELI_ITEMS_QUANTITY in einer Auswahlbox zu zeigen. Beide haben ein gemeinsames Feld namens "Ingredient_Type"

Wie kann ich meine MYSQL-Abfrage tweek, um dies zu zeigen?

Meine ursprüngliche Idee war, so etwas wie unten zu tun, aber hat nicht funktioniert

$sql_deli_meat="SELECT * FROM deli_items JOIN deli_items_quantity ON deli_items.ingredient_type=deli_items_quantity.ingredient_type WHERE enabled = 1 AND deli_items.ingredient_type = 'deli_meat' ORDER BY sort ASC"; 
+0

'mysql_ *' Funktionen sind veraltet –

+0

Sie müssen die beiden Tabellen sicher verbinden, so dass Ihre aktuelle Anweisung nicht sicher funktioniert, und verwenden Sie bitte Tabelle Aliase, um die Abfrage lesbarer zu machen! – csabinho

Antwort

2

Ich glaube, Sie mißverstehen mysql verbindet.

Die Syntax ist:

**SELECT** {YOUR COLUMNS LISTED WITH ,} **FROM** {YOUR BASE TABLE (the ONE in your one to many) **INNER JOIN** {YOUR OTHER TABLE} **ON** {BASETABLENAME.column = OTHERTABLE.column} 

So in Ihrem Beispiel, es scheint Sie haben noch keine Primärschlüssel und Fremdschlüssel. Lassen Sie uns einige erstellen, lassen Sie uns das ganze Beispiel besser machen.

Jetzt haben Sie etwas Normalisierung durchgeführt. Ihre Basisliste mit Artikeln und Zutaten befindet sich in separaten Listen und Sie haben eine Linktabelle, in der Sie Zutaten in Ihren Artikeln auswählen können. Die Menge wird in der Verknüpfungstabelle gespeichert.

Lets Blick auf die SQL für eine Auswahl.

SELECT di.name 'item', i.name 'ingredient', dii.quantity 
FROM deli_items di 
INNER JOIN deli_items_ingredients dii ON di.id= dii.deli_item_id 
INNER JOIN ingredients i ON i.id = dii.ingredients_id 

Dies gibt Ihnen die Liste aller Feinkost und die Zutaten wie:

Artikel, Zutaten, Menge

die oben Um zu erklären, sind die Buchstaben nach dem Tabellennamen alias' zu Machen Sie die Abfrage einfacher zu lesen. INNER JOIN bedeutet, dass wir in jeder Tabelle eine Aufzeichnung haben müssen, um Ergebnisse zu zeigen. Die ON-Anweisung teilt SQL mit, an was sich die identifizierenden Spalten anschließen sollen. Die Anführungszeichen in der Auswahlzeile sind Aliasnamen für die Spalten, was es einfacher macht, wenn zwei Tabellen in diesem Beispiel "name" verwenden.

Jetzt verwalten Sie Zutaten und Mengen Sie nur eine Tabelle aktualisieren und es macht Ihre Daten viel einfacher zu verwalten.

-

Es gibt viele Tutorials auf dieser Online und dies ist nur ein sehr einfaches Beispiel. Ich schlage vor, Sie hören auf, googeln und lesen ein paar Youtube über SQL-Tabellen, Normalisierung und Abfragen.

Das und schauen Sie in "PDO" und "PARAMETRISED QUERIES" und wenn Sie akzeptieren Benutzer eingeben, um Ihre Abfragen "SQL INJECTION", bevor Sie weiter gehen.

0

Diese Abfrage

SELECT * 
    FROM deli_items AS i 
    JOIN deli_items_quantity AS q ON i.ingredient_type=q.ingredient_type 
    WHERE enabled = 1 AND i.ingredient_type = 'deli_meat' 
    ORDER BY i.ingredient_type ASC 

, jedenfalls ist nicht so klar, wie die Tabellen aussehen, durch die Spalten angeben, nicht Ihre wie verwenden enabled = 1 ...

Auch wäre schön, Testen Sie die Query direkt in MySql Workbench oder dumpen Sie, was PHP tut.