Оставляя в стороне любые вопросы о том, почему вы, возможно, захотите это сделать, и почему вы вообще хотели бы сделать здесь кросс-соединение, вот лучший способ, которым я могу придумать это из головы.
Вы можете попробовать выполнить EXPLAIN для каждой таблицы и построить оператор выбора программно из результата. Вот плохой пример скрипта, который даст вам динамически генерируемый список полей с псевдонимами. Это увеличит количество выполняемых вами запросов, поскольку каждая таблица в динамически сгенерированном запросе будет вызывать выполнение запроса EXPLAIN (хотя это может быть легко устранено с помощью кэширования).
<?php
$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
function aliasFields($pdo, $table, $delim='__') {
$fields = array();
// gotta sanitise the table name - can't do it with prepared statement
$table = preg_replace('/[^A-z0-9_]/', "", $table);
foreach ($pdo->query("EXPLAIN `".$table."`") as $row) {
$fields[] = $table.'.'.$row['Field'].' as '.$table.$delim.$row['Field'];
}
return $fields;
}
$fieldAliases = array_merge(aliasFields($pdo, 'artist'), aliasFields($pdo, 'event'));
$query = 'SELECT '.implode(', ', $fieldAliases).' FROM artist, event';
echo $query;
В результате получается запрос, который выглядит следующим образом: имя таблицы и столбца разделено двумя подчеркиваниями (или любым другим разделителем, который вам нравится, см. Третий параметр для aliasFields ()):
// ABOVE PROGRAM'S OUTPUT (assuming database exists)
SELECT artist__artist_id, artist__event_id, artist__artist_name, event__event_id, event__event_name FROM artist, event
Оттуда, когда вы перебираете результаты, вы можете просто выполнить разнесение для каждого имени поля с одинаковым разделителем, чтобы получить имя таблицы и имя поля.
Ответ Джона Даута намного лучше, чем выше. Это было бы полезно, только если метаданные поля не были возвращены базой данных, поскольку угрозы для PDO могут иметь место в некоторых драйверах.
Вот простой фрагмент того, как сделать то, что Джон предположил, используя PDO вместо mysql _ * ():
<?php
$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
$query = 'SELECT artist.*, eventartist.* FROM artist, eventartist LIMIT 1';
$stmt = $pdo->prepare($query);
$stmt->execute();
while ($row = $stmt->fetch()) {
foreach ($row as $key=>$value) {
if (is_int($key)) {
$meta = $stmt->getColumnMeta($key);
echo $meta['table'].".".$meta['name']."<br />";
}
}
}