2

親愛なる友人たちよ!私のような初心者にとても親切で理解してくれてありがとう。これは私の 2 番目の質問です。ご容赦ください。

2 つのテーブル (AUTHORS と BOOKS) を結合して、テーブル 2 の AUTHOR_REF がテーブル 1 の著者の完全な名前 (AUTHOR_REF ではない) になるようにします。(authors.id と books.author_ref の間には外部キー制約の関係があります。

2 つのテーブルは次のとおりです。

    **ID     LAST NAME     FIRST NAME**
      1      Palahniuk     Chuck
      2      Faulkner      William 
      3      Beckett       Samuel

    **ID     TITLE               AUTHOR_REF**
      1      Fight Club              1
      2      Absalom, Absalom!!      2
      3      Choke                   1
      4      Waiting for Godot       3

ケース/質問: ユーザーがサイトで特定の本を検索します。準備済みステートメントを使用してクエリを準備します。

    $stmt = mysqli_prepare($db, "SELECT title, autor_ref FROM books WHERE title LIKE CONCAT('%', ?, '%')" );

「authors.last_name=books.author_ref」のような WHERE 条件で JOIN を使用する必要があることはわかっていますが、最初の SELECT から既に WHERE 条件を使用しています。どうすれば目標を達成できますか?

私は本当に混乱しています。データベースの設計が不適切ですか?

どんな助けでも感謝します。よろしく

4

3 に答える 3

2

いいえ、実際には正しい方向に進んでおり、データベースは正しく設計されています。には、節に属さないJOIN独自の条件があります。ONWHERE

SELECT
  title, 
  `FIRST NAME`,
  `LAST NAME`
FROM
  books
  /* Join brings over the author name */
  JOIN authors ON books.AUTHOR_REF = authors.ID
/* WHERE clause does not change */
WHERE title LIKE CONCAT('%', ?, '%')

既知の著者 ( )のない本がある場合は、代わりに a を使用して、本のタイトルが引き続き著者名の s で返されるようにします。AUTHOR_REF IS NULLLEFT JOINNULL

SELECT
  title, 
  `FIRST NAME`,
  `LAST NAME`
FROM
  books
  /* Left join ensures a row returned for the book even if it has no author */
  LEFT JOIN authors ON books.AUTHOR_REF = authors.ID
WHERE title LIKE CONCAT('%', ?, '%')
于 2013-01-05T13:01:22.730 に答える
1

私はこれで少し異なるデータベースを構築します...

AUTHORID     LAST NAME     FIRST NAME
  1          Palahniuk     Chuck
  2          Faulkner      William 
  3          Beckett       Samuel

BOOKID     TITLE               AUTHORID
  1        Fight Club              1
  2        Absalom, Absalom!!      2
  3        Choke                   1
  4        Waiting for Godot       3

次に、次を使用してそれらを結合します。

SELECT title, `FIRST NAME`,`LAST NAME`
FROM books
LEFT JOIN author USING (AUTHORID) 
WHERE title LIKE CONCAT('%', ?, '%')
于 2013-01-05T13:09:33.743 に答える
0
 $stmt = mysqli_prepare($db, "SELECT a.*, b.autor_ref FROM authors as a, books as b WHERE b.author_ref = a.id AND b.title LIKE '%$search%'" );

これを取得した後、完全な作者名やその他多くのもの (その作者の他の映画など) を表示できます。

于 2013-01-05T13:12:46.077 に答える