2016-04-04 5 views
0

Ich werde kurz erklären, was ich bisher getan habe- Zunächst einmal habe ich mehrere Filialen und jeder Laden hat seine eigene Tabelle, in der es enthält ID, Artikel, Menge und Preis und es gibt eine Haupttabelle, die all_items genannt wird, die die Gesamtmenge enthält, die von jeder Geschäftstabelle genommen wird.PHP Join mehrere Tabellen nicht wie erwartet funktioniert

Jetzt hat jeder Lagertisch entweder die gleiche Artikelnummer oder nicht. Hier können Sie sehen, was die Tabellen wie folgt aussieht:

Shop Tabellen genannt: S1, S2, S3

S1

id item qty price 
1 x1 10 12 
2 x2 10 15 
3 x3 5 5 

S2

id item qty price 
1 x1 10 12 
2 x4 6 6 

S3

id item qty price 
1 x3 1 5 
2 x6 5 5 
3 x7 5 12 

all_items-Enthält ursprünglichen Gesamtmenge

id item qty price 
1 x1 20 12 
2 x2 10 15 
3 x3 6 5 
4 x4 6 6 
5 x6 5 5 
6 x7 5 12 

Okay, jetzt habe ich beschlossen, die Menge, um herauszufinden, für jedes Element in allen Filialen zum Vergleichen purposes- Wie folgt:

item price S1 S2 S3 
x1 12 10 10 - 
x2 15 10 - - 
x3 5  5 - 5 
x4 6  - 6 - 
x6 5  - - 5 
x7 12 - - 5 

Ich hoffe es ist jetzt klar für Sie. Ich habe ein Formular mit Checkbox Eingabetyp erstellt (für jeden Speicher) Benutzer auswählen zu lassen, die er speichern vergleichen will, so nach dem Absenden des Formulars - eine PHP-Seite enthält den folgenden Code:

$allstore = $_POST['store']; //Collects name from checkbox ticks under form 


function createSelect($allstore) 
{ 
    if (empty($allstore)) 
     return ""; 

    $querySelect = ""; 
    $queryJoin = ""; 
    $baseTable = ""; 
    foreach ($allstore as $store => $value) { 
     if (!$querySelect) { 
      $baseTable = "all_items"; 
      $querySelect = "SELECT " . $store . ".item_no, " . $store . ".actual_price, " . $store . ".selling_price, " . $store . ".qty as " . $store; 
     } else { 
      $querySelect .= ", " . $store . ".qty as " . $store; 
      $queryJoin .= " 
      INNER JOIN " . $store . " ON " . $baseTable . ".item_no = " . $store . ".item_no"; 
     } 
    } 
    $querySelect .= " FROM " . $baseTable; 
    $query = $querySelect . $queryJoin; 

    return $query; 
} 


$allstore = array(); // The below code allows function to know how many stores selected in $allstore 
if (!empty($_POST['store'])) { 
    foreach ($_POST['store'] as $value) { 
     $allstore["s_".$value] = 0; // or 1, it doesn't matter because your function adds all the keys 
    } 
} 

var_dump(createSelect($allstore)); // Output SQL 

$query = (createSelect($allstore)); 
$result = mysql_query($query); 
//Rest of the code ..... 

Nun, wenn Sie Hinweis $baseTable = "all_items"; macht die gesamte Abfrage fehlgeschlagen. Wenn ich jedoch den Wert auf $baseTable = $store; ändere, funktioniert es und zeigt eine Ausgabe an, aber nicht wie erwartet, denn es stellt sich heraus, dass S1 jetzt die Hauptsache ist und das Ergebnis wird völlig anders sein, da es nur auf den S1-Elementen weiterleitet.

Wenn Sie eine hilfreiche Lösung zur Verfügung stellen können, werden wir uns freuen.

Antwort

0

Warum nicht UNION verwenden?

function createSelect($stores) 
{ 
    $query = ""; 
    $baseTable = "all_items"; 
    foreach($stores as $i => $store) 
    { 
     $query .= "(SELECT {$store}.id AS {$store}_id, {$store}.item AS {$store}_item, {$store}.price AS {$store}_price, {$store}.qty AS {$store}_qty, '{$store}' as Source FROM {$store}) UNION "; 
    } 
    $query .= "(SELECT all_items.id AS {$baseTable}_id, {$baseTable}.item AS {$baseTable}_item, {$baseTable}.price AS {$baseTable}_price, {$baseTable}.qty AS {$baseTable}_qty, '{$baseTable}' as Source FROM {$baseTable})"; 
    return $query; 
} 

$result = mysql_query(createSelect($allStore)); 
//Rest of code 
//if my tables are S1, S1, and my $baseTable is bs 
//echo createSelect(array('S1', 'S2'); will output (SELECT S1.id AS S1_id, S1.item AS S1_item, S1.price AS S1_price, S1.qty AS S1_qty, 'S1' as Source FROM S1) UNION (SELECT S2.id AS S2_id, S2.item AS S2_item, S2.price AS S2_price, S2.qty AS S2_qty, 'S2' as Source FROM S2) UNION (SELECT all_items.id AS all_items_id, all_items.item AS all_items_item, all_items.price AS all_items_price, all_items.qty AS all_items_qty, 'all_items' as Source FROM all_items) 
+0

Vielen Dank für Ihre Antwort, nach Ihrem Code, den ich einen Mysqli Fehler immer '-mysql_fetch_assoc() erwartet Parameter 1 Ressource, boolean given' –

+0

Sein scheint hoffnungslos Suche nach einer Lösung für diese sein. –

+0

Ich replizierte deinen Fall an meinem Ende und es scheint gut zu funktionieren. Überprüfen Sie, ob die Spaltennamen und Tabellennamen denen entsprechen, die Sie bereits haben. Wenn es nicht immer noch, lass es mich wissen – KBJ

Verwandte Themen