2016-07-13 10 views
0

Ich habe zwei Tabellen in einem DB (table_1 und table_2), Jeder von ihnen hat eine gemeinsame Spalte namens Name.UNION mit Where - Getting fataler Fehler

ich zur Zeit des folgenden Code verwenden einige Daten zu importieren (Name, status) nur von table_1:

/* database section start */ 
    $mysqli = new mysqli("z","z","z","z"); 

    if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 
/* database section end */ 

// Choose Relevant items, and turn them into an array 
$item_array = array(
'item1', 
'item2', 
'item3' 
); 

//implode items, turn into string 
$item_implode = join("','", $item_array); 

//declare an overall array for result 
$product = array(); 

$result = $mysqli->query("SELECT Name, Status as status from table_1 where Name IN ('$item_implode') ORDER BY FIELD (Name, '$item_implode');"); 

while($row = $result->fetch_assoc()) { 

    $product_name = $row['Name']; 
    // find all keys in $item_array which value is the products 
     $keys = array_keys($item_array, $product_name); 
    foreach ($keys as $key) { 

     // add values for these keys 
     $product[$key + 1]["Name"] = $row['Name']; 
     $product[$key + 1]["status"] = $row['status'];// 

    } 
} 

Ich mag auch Daten von table_2 importieren (zB benannten Spalten color, date_added)

Mein Ziel ist es, diese Schlüssel zu haben:

$product[$x]["Name"] 
$product[$x]["status"] 
$product[$x]["color"] 
$product[$x]["date_added"] 

Ich habe versucht, in dieser Form mit UNION, aber in der letzten Zeile fatalen Fehler bekommen:

$result = $mysqli->query 

("(SELECT Name, status as status from table_1 where Name IN ('$item_implode') ORDER BY FIELD (Name, '$item_implode')) 
UNION (SELECT color from table_2 where Name IN ('$item_implode') ORDER BY FIELD (Name, '$item_implode'));"); 

while($row = $result->fetch_assoc()) { 

EDIT:

Table_1:

+-------+-------------+------+-----+---------+----------------+ 
| Name | Type  | Null | Key | Default | Extra   | 
+-------+-------------+------+-----+---------+----------------+   
| Name | varchar(100)| NO |  | None |    | 
| status| varchar(5) | YES |  | NULL |    | 
+-------+-------------+------+-----+---------+----------------+ 

table_2:

+-------+-------------+------+-----+---------+----------------+ 
| Name | Type  | Null | Key | Default | Extra   | 
+-------+-------------+------+-----+---------+----------------+   
| Name | varchar(100)| YES |  | NULL |    | 
| color | varchar(5) | YES |  | NULL |    | 
+-------+-------------+------+-----+---------+----------------+ 

Aktualisierung:

dies versucht, mit:

$result = $mysqli->query 

("SELECT Name, status as status, color as color table_1 
JOIN table_2 ON table_1.Name=table_2.Name 
WHERE table_1.Name IN ('$item_implode') 
ORDER BY FIELD (table_1.Name, '$item_implode') ;"); 

while($row = $result->fetch_assoc()) { 

und bekam

Fatal error: Call to a member function fetch_assoc() on a non-object

+0

es ist keine Union, es ist ein Join auf der gemeinsamen Spalte –

+0

@LelioFaieta Ich wurde gesagt, ich sollte Union verwenden ... wie soll ich so ein Join machen, in einer Weise, die meinen ursprünglichen Code nicht zu sehr verändert? – rockyraw

+0

Was sind Ihre Daten? Erstellen Sie eine SQL-Datenbank mit Daten, zeigen Sie die erwarteten Ergebnisse in Tabellenform an. Hilf uns, dir zu helfen. Ansonsten gehen wir zur nächsten Frage über. Und diese altern einfach ab, wenn sie runtergedrückt werden. – Drew

Antwort

0

vor allem, was die mysqli Verbindungsparameter sind ??? Sollten sie wie->$conn = new mysqli($servername, $username, $password, $dbname);

Zweitens UNION kombiniert das Ergebnis von zwei oder mehr SELECT-Anweisungen, was Sie wahrscheinlich brauchen, ist eine Join-Abfrage! Welche ist so etwas wie

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID; 
0

Sind Sie nicht der FROM-Wort in der ersten Abfrage fehlt?

("(SELECT Name, status as status table_1 where Name IN ('$item_implode') ORDER BY FIELD (Name, '$item_implode')) UNION (SELECT color from table_2 where Name IN ('$item_implode') ORDER BY FIELD (Name, '$item_implode'));"); 
+0

ja, das ist nur ein Tippfehler in der Frage selbst aber – rockyraw

+0

aus Wiki: In SQL die UNION-Klausel kombiniert die Ergebnisse von zwei SQL-Abfragen in einer einzigen Tabelle aller übereinstimmenden Zeilen. Die beiden Abfragen müssen die gleiche Anzahl von Spalten und kompatiblen Datentypen ergeben, um sie zu vereinen. Doppelte Datensätze werden automatisch entfernt, es sei denn UNION ALL wird verwendet. – GodlyHedgehog

+0

Also, wenn Sie UNION verwenden werden Sie fehlschlagen, da Status und Farbe nicht als eine Spalte zusammengeführt werden (und Sie brauchen es nicht). Also benutze JOIN wie von anderen vorgeschlagen – GodlyHedgehog

0
$result = $mysqli->query(" 
    SELECT Name, status as status, color 
    FROM table_1 
    JOIN table_2 ON table_1.Name=table_2.Name 
    WHERE table_1.Name IN ('$item_implode') 
    ORDER BY FIELD (table_1.Name, '$item_implode') 
"); 

Diese Abfrage sollte für Sie tun. Ich sage, sollte, da ich es nicht testen kann, ohne eine Tabellenstruktur, Daten und erwartete Ergebnisse zu sehen. Diese Abfrage gibt eine Zeile für jedes Element in der ersten Tabelle mit einer entsprechenden Zeile in der zweiten zurück. Die Korrespondenz basiert darauf, in beiden Tabellen den gleichen Namen zu haben

+0

Ich bin nicht sicher, ob dieser Code nicht funktioniert, oder wenn ich ein Problem mit '(' ';' Zeichen habe. Ich habe meine Frage aktualisiert, wenn Sie sehen, dass das nicht korrekt ist Bitte bearbeiten Sie Ihre Antwort mit dem vollständigen Code, danke – rockyraw