2016-04-26 3 views
0
select b.book_id,isbn,title,description,book_count,group_concat(concat_ws(' ',a.firstname,a.middlename,a.lastname)) as authors 
from book b, author a, author_book ab 
where b.book_id = ab.book_id and a.author_id = ab.author_id 
and (a.firstname like '%abc%') group by isbn; 

Der obige Code erzeugt,MySQL GROUP_CONCAT() erzeugt Teilantwort nach einer LIKE Einschränkung in Abfrage

1001 | 123456789| C Programming | Good book for beginners |   10 | abcd 

aber die richtige Antwort ist von mehreren Autoren als (einschließlich efgh, ijkl Autoren)

ohne Verwendung LIKE constraint wie

select b.book_id,isbn,title,description,book_count,group_concat(concat_ws(' ',a.firstname,a.middlename,a.lastname)) as authors 
from book b, author a, author_book ab 
where b.book_id = ab.book_id and a.author_id = ab.author_id group by isbn; 
erreicht
1001 | 123456789| C Programming | Good book for beginners |   10 | abcd, efgh, ijkl 
1002 | 1234567890111 | Java | Good book for Java Programmers |   5 | xyz, uvw 
... 
... 

die vor 10

Wie erreiche ich die erwartete Leistung?

+1

Was ist Ihre erwartete Ausgabe hier? Sie erhalten exakte Ergebnisse basierend auf Ihren SQL-Anweisungen. Ofcource sehen Sie Autor 'abcd', wenn Sie 'und (a.firstname mögen '% abc%')' –

+0

verwenden Ich möchte alle Buch-Informationen mit allen Autoren Name, wo einer des Autors LIKE ??? ist. Hier bekomme ich natürlich Buchinfo mit dem Autor LIKE ???, nicht alle Autoren. Wie geht das? –

+1

Beenden Sie die Verwendung von Kommas zwischen Tabellen in der Klausel from, damit Sie die explizite Joinsyntax verwenden können. –

Antwort

1

Die anderen Autoren werden entfernt, da Ihre Einschränkung für Autornamen auch dann gilt, wenn Sie sie verwendet haben, um die gewünschten Bücher auszuwählen.

Verwenden Sie Ihren aktuellen Autorenfilter, um eine Liste der Buch-IDs zurückzugeben, und verwenden Sie diese als Unterabfrage WHERE bookId IN (SELECT ...), um die gewünschten Bücher zu filtern und erneut mit author_book und author zu verbinden, um alle Autoren ausgewählter Bücher zu erhalten.

so etwas wie dieses Versuchen:

select b.book_id,isbn,title,description,book_count, 
group_concat(concat_ws(' ',a.firstname,a.middlename,a.lastname)) as authors 
from book b, author a, author_book ab 
where 
b.book_id = ab.book_id 
and a.author_id = ab.author_id 
and b.book_id IN (
    SELECT ab.book_id 
    from author a, author_book ab 
    where a.author_id = ab.author_id and (a.firstname like '%abc%') 
) 
group by isbn; 
+0

Danke. es funktioniert gut. –

1

Sie können mit Ihren Tisch einmal zweimal beitreten, nach Autor filtern nach unten, und dann zum zweiten Mal alle Autoren für die entsprechenden Bücher aufzulisten; und dies mit nur einer select select-Klausel tun.

nb: Ich nehme an, book_count kommt aus der Tabelle Bücher.

SELECT 
     b.book_id 
    , b.isbn 
    , b.title 
    , b.description 
    , b.book_count 
    , group_concat(concat_ws(' ', a2.firstname, a2.middlename, a2.lastname)) AS authors 
FROM author AS a1 
     INNER JOIN author_book AS ab ON a1.author_id = ab.author_id 
     INNER JOIN book AS b ON b.book_id = ab.book_id 
     INNER JOIN author AS a2 ON a2.author_id = ab.author_id 
WHERE a1.lastname LIKE 'a%' 
GROUP BY 
     b.book_id 
    , b.isbn 
    , b.title 
    , b.description 
    , b.book_count 
; 
  1. Bitte beachten Sie Kommas zwischen Tabellennamen in der von Klausel sollten aufhören, die Sie Syntax zu verabschieden explizite Join hilft.
  2. Zusätzlich sollten Sie immer (keine Ausnahmen) auf jede Spalte mit der entsprechenden Tabelle oder dem Alias ​​als Präfix verweisen.
  3. Listen Sie immer alle nicht aggregierenden Spalten in der group by-Klausel auf. (MySQL hat eine „lazy Syntax“, die nur eine einzige Spalte annehmen kann - aber es kann je nach Servereinstellungen fehlschlagen.)

IF die book_count berechnet tatsächlich dann:

SELECT 
     b.book_id 
    , b.isbn 
    , b.title 
    , b.description 
    , COUNT(DISTINCT b.book_id) AS book_count 
    , group_concat(concat_ws(' ', a2.firstname, a2.middlename, a2.lastname)) AS authors 
FROM author AS a1 
     INNER JOIN author_book AS ab ON a1.author_id = ab.author_id 
     INNER JOIN book AS b ON b.book_id = ab.book_id 
     INNER JOIN author AS a2 ON a2.author_id = ab.author_id 
WHERE a1.lastname LIKE 'a%' 
GROUP BY 
     b.book_id 
    , b.isbn 
    , b.title 
    , b.description 
; 
+0

@UsedByAlready Danke für die detaillierte Erklärung und Ihre Mühe :) –

+0

kein Problem, danke. –