2016-11-15 19 views
4

Lassen Sie mich mich selbst klären, ist meine Frage "Wie Zeilen aus der Bindung einzelner Tabellen und eine Querverweistabelle ohne wiederholende Werte auswählen?"Wählen Sie aus zwei Tabellen, ohne alle Werte zu wiederholen

Im Moment habe ich drei Tabellen, eine Querverweistabelle und zwei Einzeltische:

  Table jobs 
╔══════════╦══════════════════════════╗ 
║ job_id ║ details     ║ 
╠══════════╬══════════════════════════╣ 
║ 1  ║ Looking for hire...  ║ 
║ 2  ║ We need help!...  ║ 
║ 3  ║ We are a store that... ║ 
║ 4  ║ Help wanted...   ║ 
╚══════════╩══════════════════════════╝ 

     Table job2pos 
╔═══════════╦═════════════╗ 
║ job_id ║ position_id ║ 
╠═══════════╬═════════════╣ 
║ 1  ║ 10   ║ 
║ 2  ║ 10   ║ 
║ 2  ║ 12   ║ 
║ 3  ║ 11   ║ 
║ 3  ║ 13   ║ 
║ 4  ║ 10   ║ 
╚═══════════╩═════════════╝ 

     Table positions 
╔═══════════════╦═══════════════╗ 
║ position_id ║ position_name ║ 
╠═══════════════╬═══════════════╣ 
║ 10   ║ waitress  ║ 
║ 11   ║ cashier  ║ 
║ 12   ║ cook   ║ 
║ 13   ║ chef   ║ 
╚═══════════════╩═══════════════╝ 

Wenn ich führen diese Abfrage:

$sql = "SELECT jobs.details, positions.name AS position FROM jobs 
INNER JOIN job2pos ON jobs.job_id = job2pos.job_id 
INNER JOIN positions ON job2pos.position_id = positions.position_id 
WHERE job2pos.job_id IN (2)"; 
... 
print_r($stmt->fetchAll(\PDO::FETCH_ASSOC)); 

Und ich folgendes:

Array(
    [0] => Array ([details] => We need help!... 
       [position] => Waitress) 
    [1] => Array ([details] => We need help!... 
       [position] => Cook) 
) 

Jetzt habe ich 2 Zeilen für den gleichen Job, aber was ich will, ist etwas ähnliches:

Array(
    [0] => Array ([details] => We need help!... 
       [position] => Array ([0] => Waitress 
            [1] => Cook) 
       ) 
) 
  • Wenn Sie einige unnötige Code hinweisen könnte ich in meinem Code haben, der groß sein würde.
+0

Versuchen Sie, 'select distinct jobs.job_id'? –

+2

Möglicherweise müssen Sie Ihre Abfrage in zwei separate Abfragen aufteilen. Es funktioniert so, wie es sein sollte. – Maximus2012

+0

@ user3360140 Versucht, aber funktioniert nicht: < – Sarah

Antwort

1

Was Sie beschreiben, ist nicht möglich mit nur einer SQL-Anweisung. Sie können sich ein Ergebnis so vorstellen, als wäre es ein Tisch. Sie können keine verschachtelten Informationen in plain sql haben.

Wir haben die Option nosql Datenbanken zum Speichern und Abrufen von Objekten.

Allerdings denke ich, was Sie wirklich haben möchten, ist die Auswahl multiple statements with one call.

Vom mysqli documentation:

MySQL ermöglicht optional mehrere Anweisungen in einer Anweisung Zeichenfolge mit. Das gleichzeitige Senden mehrerer Anweisungen reduziert die Anzahl der Client-Server-Verbindungen , erfordert jedoch eine besondere Behandlung.

Mehrere Anweisungen oder Mehrfachabfragen müssen mit mysqli_multi_query() ausgeführt werden. Die einzelnen Anweisungen der Anweisung string sind durch Semikolon getrennt. Dann müssen alle Ergebnismengen, die von den ausgeführten Anweisungen zurückgegeben werden, abgerufen werden.

Der MySQL-Server erlaubt es, Anweisungen zu haben, die Resultsets zurückgeben, und Anweisungen, die keine Ergebnismengen in einer multiplen -Anweisung zurückgeben.

Für PDO aus this Q&A:

$stmt = $db->query("SELECT 1; SELECT 2;"); 
$stmt->nextRowset(); //Move to next statement result 
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); //SELCT 2 result 
Verwandte Themen