Столбец в списке полей неоднозначен MYSQL, PHP, SEARCH, SELECT - PullRequest
1 голос
/ 05 мая 2011

Я пытаюсь выбрать информацию из моей базы данных 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%'";

, и я получаю эту ошибку: Столбец 'author' в выражении where неоднозначен,Что я понимаю, потому что у меня есть несколько таблиц с одним и тем же именем поля.

Я хочу извлечь информацию из этих таблиц и из этих полей:

 -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>";
}  }

Может кто-нибудь предложитьмне любая помощь?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 05 мая 2011

, потому что поля называются одинаково

try:

$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%'";

и т. Д.

0 голосов
/ 05 мая 2011

быстро и грязно

$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 полем integer, связывающимся с users.id, или полем символа, связывающимся с users.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%'"; 

Обратите внимание, что, поскольку все связано с автором, вам нужно перечислить это поле только один раз, потому что в противном случае вы получите 3 авторских поля с одинаковым содержанием, , что было бы глупо.

0 голосов
/ 05 мая 2011

Это большой код для простого вопроса. Неоднозначный означает, что идентификатор либо в выбранном вами случае, либо в случае, когда он присутствует в более чем одной таблице. Если вы говорите «Выбор авторов», вам необходимо указать из какой таблицы .. так маркеры. авторы. Если вы делаете «где авторы ..» вам нужно «где markers.authors»

Я бы предложил объединить ваши столы.

...