Domanda

C'è un modo per enumerare le tabelle in mysql query?

Diciamo che ho query :

SELECT * FROM   db_people.people_facts pf
INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id
INNER JOIN db_people.people p ON sm.target_id = p.object_id
ORDER BY pf.object_id DESC

E voglio in cambio di matrice:

$tables = array(
[0] => 'db_people.people_facts',
[1] => 'db_system.connections',
[2] => 'db_people.people',
);
È stato utile?

Soluzione

La soluzione contrassegnati come buona volontà di restituire solo il risultato tabelle.Ma se si fa la query successiva si avrà esito negativo:

SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id

Sarà restituire solo gli utenti e non cani e gatti tabelle.

La soluzione migliore è trovare un buon parser, un'altra soluzione è usare REGEX e SPIEGARE query (ulteriori informazioni nel link seguente):

Ottenere mysql tabelle in una query

Ma penso che un'altra buona soluzione è elenco di tutte le tabelle e di ricerca all'interno della query, è possibile memorizzare la lista dei tavoli.

MODIFICA:Durante la ricerca per le tabelle, è meglio usare un preg come:

// (`|'|"| )table_name(\1|$)
if(preg_match('/(`|\'|"| )table_name(\1|$)/i', $query))
    // found

Se non, si può tornare falsi positivi, per esempio, "table_name2", "table_name3"...table_name tornerà TROVATO due volte.

Altri suggerimenti

Sì, è possibile ottenere informazioni sulle tabelle e colonne che fanno parte di un risultato della query. Questo si chiama metadati set di risultati .

L'unica soluzione PHP per MySQL metadati risultato è impostato per utilizzare l'estensione MySQLi e la funzione mysqli_stmt::result_metadata() .

$stmt = $mysqli->prepare("SELECT * FROM   db_people.people_facts pf
  INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id
  INNER JOIN db_people.people p ON sm.target_id = p.object_id
  ORDER BY pf.object_id DESC");

$meta = $stmt->result_metadata();

$field1 = $meta->fetch_field();

echo "Table for field " . $field1->name . " is " . $field1->table . "\n";

Si dovrà costruire la serie di tabelle distinte utilizzate nella query da soli, dai loop sui campi.

A seconda di quello che stai usando per, MySQL di spiegare potrebbe fare il trucco per voi:

http://dev.mysql.com/doc/refman /5.0/en/explain.html

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