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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top