Intereting Posts
Автоматический перезапуск PHP-скрипта на выходе Данные, имеющие проблемы с запятыми в json Внедрение входа Oauth2, Неустранимая ошибка: Class 'Google_Service' не найден WordPress – получение сообщений по типу и категории пользовательских сообщений, причем каждая категория автоматически помещается в DIV Часовой пояс базы данных Как я могу загрузить более 50 МБ mp4 видео в codeigniter? Symfony2 – определить, находится ли пользователь в защищенном брандмауэре CSV-файл из MySQL с использованием PHP с помощью apopach (mysqli-> connect и т. Д.) Почему PHP допускает «несовместимые» конструкторы? Обновите содержимое div только в том случае, если в базу данных добавлен новый контент Бэкэйн кэша скриптов в памяти в zend framework Отобразить список элементов, сгруппированных по годам и месяцам в TYPO3 Fluid Добавить в php / ajax не работает Почему я получаю «POST http: //54.xx.xx.xx/wp-admin/admin-ajax.php 500 (Internal Server Error)» при использовании WordPress + Ajax? Передача переменной с PHP на javascript и на html-форму

SQL Select * из нескольких таблиц

Используя PHP / PDO / MySQL, можно ли использовать подстановочный знак для столбцов, когда выбор выполняется на нескольких таблицах, а возвращаемые ключи массива полностью квалифицированы, чтобы избежать столкновения имени столбца?

пример:

SELECT * из таблицы1, table2;

дает:

Клавиши массива – «table1.id», «table2.id», «table1.name» и т. Д.

Я попытался «SELECT table1. *, Table2. * …», но возвращаемые ключи массива не были полностью определены, поэтому столбики с тем же именем столкнулись и были перезаписаны.

Related of "SQL Select * из нескольких таблиц"

Да, ты можешь. Самый простой способ – с pdo, хотя есть хотя бы несколько других расширений, которые способны на это.

п.д.о.

Установите атрибут объекта PDO , а не PDOStatment .

$PDO->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true); 

Вот и все. Затем вы получаете ассоциативные ключи массива, такие как myTable.myColumn . Он работает, если вы извлекаете объект слишком осторожно, потому что вам нужно получить доступ к таким свойствам, как

 $obj->{'myTable.myColumn'}; 

* В руководстве говорится, что атрибут поддерживается только некоторыми драйверами. Если вышеуказанное не работает, это может сработать.

 $pdoStatement->setFetchMode(PDO::FETCH_NUM); $pdoStatement->execute(); //build our associative array keys $qualifiedColumnNames = array(); for ($i = 0; $i < $pdoStatement->columnCount(); $i++) { $columnMeta = $pdoStatement->getColumnMeta($i); $qualifiedColumnNames[] = "$columnMeta[table].$columnMeta[name]"; } //fetch results and combine with keys while ($row = $pdoStatement->fetch()) { $qualifiedRow = array_combine($qualifiedColumnNames, $row); print_r($qualifiedRow); } 

Такой же базовый шаблон используется для других расширений базы данных

MySQL

 $res = mysql_query($sql); //build our associative array keys $qualifiedColumnNames = array(); for ($i = 0; $i < mysql_num_fields($res); $i++) { $columnMeta = mysql_fetch_field($res, $i); $qualifiedColumnNames[] = "$columnMeta[table].$columnMeta[name]"; } //fetch results and combine with keys while ($row = mysql_fetch_row($res)) { $qualifiedRow = array_combine($qualifiedColumnNames, $row); print_r($qualifiedRow); } 

MySQLi

 $res = $mysqli->query($sql); //build our associative array keys $qualifiedColumnNames = array(); foreach ($res->fetch_fields() as $columnMeta) { $qualifiedColumnNames[] = "{$columnMeta->table}.{$columnMeta->name}"; } //fetch results and combine with keys while ($row = $res->fetch_row()) { $qualifiedRow = array_combine($qualifiedColumnNames, $row); print_r($qualifiedRow); } 

вы можете сделать это:

 SELECT Table1.*,Table2.xyz, Table2.abc,... From... 

где вы получаете все столбцы из одной таблицы, используя «*», а затем только столбцы из другой таблицы, в которой вы нуждаетесь, поэтому нет столкновения.

Вы также можете использовать псевдонимы столбцов, в которых вы «переименовываете» столбец:

 SELECT Table1.A AS T1_A,Table2.A AS T2_A,... From... 

ваш результирующий набор будет состоять из столбцов T1_A и T2_A

К сожалению нет; синтаксиса SQL для обеспечения уникальности имен столбцов нет.

Если вы действительно не знаете имена столбцов и должны использовать SELECT * , единственным реальным вариантом будет возврат к очень уродливому динамическому SQL, который мог бы проверять структуру таблиц и генерировать запрос, который будет выбирать их все явно с префиксом имени таблицы.

Я не знаю, какие RDBMS вы используете, но что-то вроде этого должно работать на SQL Server:

 declare @columns table (idx int identity(1,1), tablename varchar(100), columnname varchar(100)) insert into @columns (tablename, columnname) select tablename, columnname from INFORMATION_SCHEMA.COLUMNS where tablename in ('table_1', 'table_2') declare @sql nvarchar(4000) declare @i int declare @cnt in declare @col varchar(100) declare @table varchar(100) select @i = 0, @cnt = max(idx), @sql = '' from @columns while @i < @cnt begin select @i = @i + 1 select @col = columnname, @table = tablename from @columns where idx = @i if len(@sql) > 0 select @sql = @sql + ', ' select @sql = @sql + '[' + @table + '].[' + @col + '] as [' + @table + '_' + @col + ']' end select @sql = 'select ' + @sql + ' from table_1, table_2' exec sp_executesql @sql 

Бесстыдно переупакован из @goat:

 // Workaround for setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true); function pdoStatementExecuteAndFetchObjWithTableNames(PDOStatement $statement) { $statement->setFetchMode(PDO::FETCH_NUM); $statement->execute(); //build our associative array keys $qualifiedColumnNames = array(); for ($i = 0; $i < $statement->columnCount(); $i++) { $columnMeta = $statement->getColumnMeta($i); $qualifiedColumnNames[] = "$columnMeta[table].$columnMeta[name]"; } //fetch results and combine with keys while ($row = $statement->fetch()) { $qualifiedRow = array_combine($qualifiedColumnNames, $row); yield (object) $qualifiedRow; } } 

ПРИМЕЧАНИЕ. Если вы используете:

SELECT 1 FROM my_table AS my_table_alias

то вы получите my_table . Я бы надеялся на my_table_alias . Я получил этот результат с PHP 5.6 и SQL-драйвером.

К сожалению, PHP (в частности, MySQL, PgSQL, MSSQL-расширения) всегда будет переписывать ваши столбцы в случае перекрытия.

Я бы рекомендовал создать представление в вашей базе данных и псевдоним ваших столбцов, чтобы они были «полностью квалифицированными».

Например: (MySQL)

 CREATE VIEW viewTable1Table2 AS SELECT t1.field1 AS Table1Field1 t2.field1 AS Table2Field1 FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id; 

Синтаксис может быть не идеальным, но вы можете получить общее представление о том, о чем я говорю.