Столбец в списке полей неоднозначен 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"
Я бы предложил объединить ваши столы.