1

データベースへの接続に成功した後、次のステートメントを使用してmysqlデータベースから情報を選択しようとしています。

$query = "SELECT * FROM `users`, `markers`,`imagemarkers` 
    WHERE username LIKE '%$s%' 
    OR email LIKE '%$s%' 
    OR location LIKE '%$s%' 
    OR author LIKE '%$s%' 
    OR bike LIKE '%$s%' 
    OR id LIKE '%$s%' 
    OR title LIKE '%$s%'";

そして、私はこのエラーを受け取ります:where句の列'author'があいまいです。同じフィールド名のテーブルが複数あるため、これは理解できます。

これらのテーブルとこれらのフィールドから情報を抽出したいと思います。

 -markers:
    author
    title
    bike
    id
    date

 -imagemarkers:
   -author
   -title
   -id
   -date

 -users:
   -loction
   -email
   -username
   -id

私は解決策を探しましたが、これまでのところ、各テーブルフィールドは次のように参照する必要があるという結論に達しました。

  markers.title
  imagemarkers.title

  markers.author
  imagemarkers.author

  markers.date
  imagemarkers.date

  markers.id
  imagemarkers.id
  users.id

そして、そのステートメントは次のようになります。

  SELECT markers.author
    FROM markers JOIN imagemarkers ON markers.author = imagemarkers.author

しかし、取得する必要のある情報量でこれを機能させる方法がわかりません。

私が現在持っているコード全体は次のようになります。

        if (isset($_POST['submit'])) {
    if ($_POST['search'] !="") {
    require("connection.php");

    $s = mysql_real_escape_string($_POST['search']);
    $query = "SELECT * FROM `users`, `markers`,`imagemarkers` WHERE username LIKE '%$s%' OR email LIKE '%$s%' OR location LIKE '%$s%' OR author LIKE '%$s%' OR bike LIKE '%$s%' OR id LIKE '%$s%' OR title LIKE '%$s%'";
    $result = mysql_query($query, $connect)
        or die(mysql_error());

    $num = mysql_num_rows($result);

    echo "<h2>you searched for: " . $s . "..</h2>";
    echo "<h5>there are " . $num . " results</h4>";

while ($row = mysql_fetch_assoc($result)) {
    echo "<p>username: " . $row['username'] . "<br />";
    echo "location: " . $row['location'] . "</p>";
    echo "author: " . $row['author'] . "</p>";//error: Column 'author' in where clause is ambiguous, same with date. 
    echo "date: " . $row['date'] . "</p>";
    echo "id: " . $row['id'] . "</p>";
    echo "title: " . $row['title'] . "</p>"; 
    echo "<hr />";

    }
} else {
        echo "<h3> you must type something in the box</h3>";
}  }

誰かが私に助けを提供できますか?

どうもありがとう。

4

3 に答える 3

1

これは、フィールドの名前が同じであるためです。

試す:

$query = "SELECT * FROM `users` u, `markers` m,`imagemarkers` im
    WHERE u.username LIKE '%$s%' 
    OR u.email LIKE '%$s%' 
    OR u.location LIKE '%$s%' 
    OR m.author LIKE '%$s%' 
    OR m.bike LIKE '%$s%' 
    OR m.title LIKE '%$s%'";

等々

于 2011-05-05T11:04:34.873 に答える
0

速くて汚い

$query = "SELECT * FROM `users` u
INNER JOIN `markers` m ON (m.author = u.id)
INNER JOIN``imagemarkers` im ON (im.author = u.id) 
 WHERE u.username LIKE '%$s%'
  OR u.email LIKE '%$s%'
  OR u.location LIKE '%$s%'
  OR m.author LIKE '%$s%'
  OR m.bike LIKE '%$s%'
  OR m.title LIKE '%$s%'"; 

これにより、結果がリンクされ、ユーザーに関連するマーカーとイメージマーカーのみが表示されます。

markers.authorがこのクエリにリンクしているフィールドであるか、このクエリにリンクしているcharフィールドであるかはわかりません。integer前者users.idusers.name想定しています。それに応じて結合条件を調整してください。これは、テーブルと一致しません。

結合条件を省略すると、クロス結合が発生します。これは、99%は希望どおりではない可能性があります。
参照: http: //en.wikipedia.org/wiki/Join_ (SQL )

列を明示的にリストする列
を制限する場合は、明示的に名前を付ける必要があります(推奨)。

$query = "SELECT u.location, u.email, u.username as author, u.id as user_id
   ,m.title as marker_title, m.bike, m.date as marker_date, m.id as marker_id
   ,im.title as imagemarker_title, im.date as imagemarker_date, im.id as imagemarker_id  
FROM `users` u
INNER JOIN `markers` m ON (m.author = u.id)
INNER JOIN``imagemarkers` im ON (im.author = u.id) 
 WHERE u.username LIKE '%$s%'
  OR u.email LIKE '%$s%'
  OR u.location LIKE '%$s%'
  OR m.author LIKE '%$s%'
  OR m.bike LIKE '%$s%'
  OR m.title LIKE '%$s%'"; 

すべてが作成者にリンクされているため、そのフィールドを1回だけリストする必要があることに注意してください。そうしないと、まったく同じコンテンツを持つ3つの作成者フィールドが取得され、ばかげていることになります。

于 2011-05-05T11:55:47.997 に答える
0

これは簡単な質問のコードです。あいまいとは、選択したケースまたはケースが複数のテーブルに存在する場合の識別子を意味します。「作成者を選択」と言っている場合は、どのテーブルから指定する必要があります。 ..そうmarkers.authors。「whereauthors..」を実行している場合は、「wheremarkers.authors」が必要です。

私はあなたのテーブルをUNIONすることを提案します。

于 2011-05-05T10:59:03.670 に答える