2012-04-04 8 views
0

Ich implementiere eine Buchsuche basierend auf Autoren. Ich sollte ein Abfrageergebnis zurückgeben, das alle Bücher des abgefragten Autors enthält. Es ist jedoch möglich, dass eine Abfrage nach bestimmten Autornamen mehrere Ergebnisse zurückgibt (z. B. könnte eine Abfrage von "Smith, W" mit "Smith, Wesson" und "Smith, Will" übereinstimmen).Ist es möglich, Ergebnisse einer Abfrage zu "verketten"?

Also, mein Problem ist, wie alle Bücher von diesen verschiedenen Autoren "verkettet" werden. Wenn ich die Möglichkeit, mehrere Autoren nicht der Ansicht, eine Abfrage übereinstimmt, würde ich so etwas wie dies gehen (in Pseudo-Code, wie mein richtiger Code ziemlich chaotisch ist jetzt):

  • Suche Autor Tabelle für den Autor
  • Anpassung der Abfrage
  • get Autors authorid
  • Suche Buchtabelle für Buch Datensätze mit demselben authorid

jedoch mit der Möglichkeit, mehrere Autoren, ich habe so etwas in den Sinn:

// search author table for authors matching the query 

foreach(author_match as am){ 
    // search book table for book records with authorid=am.authorid 
    // Is there such thing as this? :\ 
    book_results += all the rows returned by previous query 
} 
return book_results; 

Ich mache das in PHP (mit CodeIgniter Framework) und MySQL. Gibt es eine Funktion/einen Operator, der es mir erlaubt, dies zu tun? Ja, ich habe versucht +=, selbst wenn ich nicht viel davon erwartet hatte, zu einem hässlichen Ausgang.

Wieder entschuldige ich mich für den Pseudocode. Ich werde versuchen, meinen Code aufzuräumen und so schnell wie möglich zu bearbeiten, aber wenn eine Antwort davor kommt, wäre es genauso großartig. Vielen Dank.

+0

Was mit Joining Bücher falsch ist und Autoren in einer Abfrage? – wildplasser

+2

Ich kenne Codeigniter nicht gut, aber die Abfrage, die Sie brauchen, sieht etwa so aus: 'SELECT author. *, Book. * FROM Autor LEFT JOIN book ON Autor.authorid = book.authorid WHERE author.authorid = ' –

+0

Ich habe zugegebenermaßen noch nicht in JOINS geschaut. Werde sie versuchen und später Bericht erstatten. Vielen Dank. – skytreader

Antwort

2

ich mit Michael einverstanden sind, es scheint, dass Sie benötigen entweder eine INNER JOIN oder eine LEFT JOIN.

Sie sagen, Sie Codeigniter verwenden, so ist hier ein Codeigniter konkretes Beispiel:

$this->db->select('author.*, 
        book.*'); 
$this->db->from('authors'); 
$this->db->join('books', 'books.authorid = authors.id', 'left'); 
$this->db->where('authors.id', $the_author_id); 

Siehe auch:

+0

Ich habe herausgefunden, wie Joins in meiner Abfrage verwendet werden, aber danke für das CodeIgniter-spezifische Beispiel (-,) – skytreader

-1

eine concatenate in PHP zu tun, JOIN

.= 
+0

Das '+ =' war ein Teil von Pseudocode, und '. =' Ist ein String-Konkatenator, äußerst hilfreich beim Anhängen von Abfrageergebnissen ... –

+0

Er möchte Strings verketten.Es sei denn, Sie haben eine bessere Möglichkeit, die Namen der Dinge zu speichern. Deklarieren Sie eine Variable, öffnen Sie dann die Abfrageergebnisschleife und. = Die Ergebnisse. –

+0

Außerdem dachte ich, dass '. =' Ist ausschließlich String und '+ =' ist für, ähm, alles andere, numerische Daten und etc. (anscheinend nicht). Ja, sogar in meinem echten Code habe ich '+ =' versucht. Ich möchte Datensätze verketten, die, AFAIK sind Zeiger/Cursor, keine Zeichenfolgen. – skytreader

0

Vielleicht verwenden Sie Ihre Abfrage ändern können LEFT zu verwenden. Auf diese Weise können Sie mehrere Abfrageergebnisse in einer Abfrage abrufen.

+0

Ummm, MySQL implementiert 'UNION's, na ja,' UNION's. 'LEFT JOIN' ist ein ganz anderes Konzept. –

1

Sie können .= zum Verketten verwenden. Jedoch effizienter, können Sie einfach mehrere WHERE-Klauseln in SQL, so dass Sie die folgenden Pseudo-Code haben würde:

search author table for authors matching the query 
where = 'with ' 
foreach(author_match as am){ 
where += 'authorid=' . am.authorid . ' OR' } 
where = substr(where[0,strlen(where)-3) 
} 
search book table for book records [where clause here] 
return book_results 
Verwandte Themen