Столбец в списке полей неоднозначен MYSQL, PHP, SEARCH, SELECT

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

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

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

 -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 ответа

Решение

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

$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 авторских поля с одинаковым содержимым, что было бы глупо.

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

пытаться:

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

и так далее

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

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

Другие вопросы по тегам