SQL Select * birden fazla tablodan

4 Cevap php

PHP Kullanımı / PDO / MySQL bir select birden fazla tablo üzerinde yapılan ve dönen dizi anahtarları sütun adı çatışma önlemek için tam nitelikli olduğunda sütunlar için bir joker kullanmak mümkün mü?

Örnek:

SELECT * from table1, table2;

verir:

Dizi anahtarlar 'table1.id', 'table2.id', 'table1.name' vs vardır

Ben "* .... *, Table2. Tablo1 SELECT" denedik ama aynı adı taşıyan sütunlar çarpıştı ve üzerine bu yüzden dönen dizi anahtarları tam değildi.

4 Cevap

Evet, yapabilirsiniz. Bunun yeteneğine sahip en az birkaç diğer uzantıları var olsa kolay yolu, PDO ile.

pdo

PDO nesnesi değil, PDOStatment üzerine özniteliğini ayarlayın.

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

İşte bu. Sonra myTable.myColumn gibi ilişkisel dizi anahtarları olsun. Eğer çok çok dikkatli bir nesne getir eğer gibi özelliklere erişmek için gerekir, çünkü işleri

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

* manual says Bu özellik sadece belirli sürücüleri tarafından desteklenmektedir. Yukarıdaki işe yaramazsa, bu might yerine çalışır.

$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);
}

Aynı temel model diğer veritabanı uzantıları için kullanılır

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);
}

bunu yapabilirsiniz:

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

Eğer "*" kullanarak ve sonra ihtiyacınız diğer tablodan sadece sütunları bir tablodan tüm sütunları olsun, hiçbir çatışma olduğu yerde.

Ayrıca bir sütun "yeniden adlandırmak" nerede, sütun diğer adları kullanabilirsiniz:

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

Lütfen sonuç kümesi sütun T1_A ve T2_A olurdu

Ne yazık ki, hayır; Sütun adları benzersiz olmasını sağlamak için hiçbir SQL sözdizimi yoktur.

Eğer gerçekten sütunların isimlerini bilmiyorum ve SELECT * kullanmanız gerekiyorsa, tek gerçek seçenek tablo yapısını incelemek ve bir sorgu oluşturabilir bazı çok çirkin görünümlü dinamik SQL dönmek olacaktır bu tablo-adı öneki ile açıkça hepsini seçmek olacaktır.

Ben kullandığınız RDBMS bilmiyorum, ama böyle bir şey SQL Server üzerinde çalışması gerekir:

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

Ne yazık ki, PHP (özellikle MySQL, PgSQL, MSSQL uzantıları) her zaman sütunlar çakışma durumunda üzerine yazılır olacaktır.

Onlar "tam nitelikli" böylece senin veritabanında bir View oluşturma tavsiye ve Alias ​​senin sütunlar olacaktır.

Örneğin: (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;

Sözdizimi mükemmel olmayabilir, ama ben bahsediyorum genel bir fikir edinebilirsiniz.