La colonna nell'elenco dei campi è ambiguo mysql, php, ricerca, seleziona
-
29-10-2019 - |
Domanda
Sto cercando di selezionare le informazioni dal mio database MySQL con questa affermazione dopo aver effettuato una connessione riuscita al database:
$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%'";
E sto ricevendo questo errore: colonna "autore" nella clausola dove è ambigua. Che ho capito essere perché ho più tabelle con lo stesso nome di campo.
Voglio estrarre le informazioni da queste tabelle e da questi campi:
-markers:
author
title
bike
id
date
-imagemarkers:
-author
-title
-id
-date
-users:
-loction
-email
-username
-id
Ho cercato la soluzione e finora sono giunto alla conclusione che ogni campo della tabella dovrebbe essere definito qualcosa di simile:
markers.title
imagemarkers.title
markers.author
imagemarkers.author
markers.date
imagemarkers.date
markers.id
imagemarkers.id
users.id
E che l'affermazione potrebbe sembrare qualcosa di simile:
SELECT markers.author
FROM markers JOIN imagemarkers ON markers.author = imagemarkers.author
Ma non sono sicuro di come far funzionare questo con la quantità di informazioni di cui ho bisogno per recuperare.
L'intero codice che ho in questo momento sembra così:
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>";
} }
Qualcuno può offrirmi aiuto?
Grazie mille.
Soluzione
veloce e sporco
$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%'";
Ciò collegherà i risultati insieme, in modo che vengano mostrati solo marcatori e immagini relativi agli utenti.
Nota che non so se i marker. integer
campo che collega a users.id
o un campo char che collega a users.name
Questa query presuppone la prima, regola la condizione di join di conseguenza è che non corrisponde ai tavoli.
Se lasci fuori le condizioni di join, finirai con un join incrociato, che è probabilmente il 99% non quello che desideri.
Vedere: http://en.wikipedia.org/wiki/Join_(sql)
Elencando esplicitamente le colonne
Se vuoi limitare le colonne dovrai nominarle esplicitamente (consigliate).
$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%'";
Si noti che poiché tutto è collegato all'autore, è necessario elencare quel campo solo una volta, perché altrimenti otterresti 3 autori con esattamente lo stesso contenuto, che sarebbe sciocco.
Altri suggerimenti
Questo perché i campi sono nominati allo stesso modo
Tentativo:
$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%'";
e così via
Questo è un sacco di codice per una semplice domanda. Ambiguo significa che un identificatore nel tuo caso selezionato o dove il caso è presente in più di una tabella. Se stai dicendo "seleziona autori", devi specificare da quale tabella .. Quindi marker.authors. Se stai facendo "dove gli autori .." hai bisogno "dove gli autori"
Vorrei suggerire un sindacato dei tuoi tavoli.