Doğru veritabanı sonuçlarını sıralamak için nasıl

2 Cevap

Ben doğru benim verileri sıralamak konusunda yeni bir soru göndermek için istendi. İşte yapmak ne çalışıyorum olduğunu. Ben bu sayfa için gereken tüm veriler için benim veritabanına tek bir yolculuk yapmak istiyorum. Ben veritabanından döndürülen verileri aldıktan sonra, ben onu dışarı sıralamak ve kullanmak gerekir.

Kısaca ifade etmek için, sadece tek bir veri satırı ilanıyla. Gerçekte vardır, 8 satır iade ediliyor. Burada iade edilen verilerin yapısı aşağıdaki gibidir:

col1    col2    col3    col4    col5    col6    col7    col8    col9

Şimdi, burada yaşıyorum sorundur. Sütunlar 1 ile 7 1:1 dataset tutun. Kolonlar 8 ve 9 Ancak, çok sayıda satır, dolayısıyla toplam 8 satır tutun. Ben 1 ile karışık sütunlar 1'den 7'ye kadar var çünkü: M satırlar, ben arasındaki satırları ben gerek daha 1-7 Temmuz kat daha fazla yankı duyuyorum.

Bunu nasıl çözebilirim?


Bana sadece bu sorguda kullanılan katılır 4 iç olduğunu ekleyelim. Tablolardan biri, ben sadece bir kez erişmek için gereken sayfa belirli verileri tutar. Diğer diğer satırları oluştururken ne katıldı. Bana sadece bu resultset'de çıkışı kesinlikle doğru tat diyelim. Ben sadece sıralamak için nasıl anlamaya gerekir.


Tamam, bu anlamda yapmak gerekir ....

dealerId  empId  lotId  rackId  porterId  vehicle  vin
1         1      1      1       1         Geo      12JI997676JH
1         1      1      1       1         Ford     87HJ879854HS
1         1      1      1       1         BMW      567876HCS456
1         1      1      1       1         Mercedez 1JI8787GS687

Bu set, ben veri tekrarı 4 satır var olduğunu fark. Neye ihtiyacım şudur:

dealerId  empId  lotId  rackId  porterId
1         1      1      1       1

VE sonra birden çok satır için, ben bu ihtiyacı:

vehicle  vin
Geo      12JI997676JH
Ford     87HJ879854HS
BMW      567876HCS456
Mercedez 1JI8787GS687

Yani, bu kurulum şimdi bana satıcı veri single satır verir ve ben şimdi araç veri ile yeni bir dizi var. :)

2 Cevap

Tamam, bu yüzden soru, bu verileri nasıl kullanacağınızı istiyorsunuz nedir? Eğer bu şekilde görüntülemek istiyorsanız, araç başına bir satır, bu JOINed veri almaya ve sadece bunun üzerinden gitmek mantıklı:

foreach ($row as $vehicle) {
    echo "$vehicle[vehicle] … $vehicle[dealerId]\n";
}

Her alınan satır ilgili bir veri kümesi temsil eder.

OTOH, JOINed araç veri aslında vb dealerIds ile çok yapmak zorunda değildir, eğer, o ayrı sorgularda bu iki şeyi almak için çok daha mantıklı. Bu muhtemelen çok daha hızlı.

Al (ve mağaza, başlamak için) mümkün olduğunca PHP kodu olarak küçük bir post-masaj yapmak zorunda mantıklı basit şekilde veri. "retrieve everything in a single query" sırf olması için hedef belirledi etmeyin. Eğer veritabanına çeşitli geziler çok pahalı korku varsa, muhtemelen değil. Your zaman ikinci ikinci bir istek yapmak için gereken çok daha değerli bölünme daha.

(Ben gerçekleştirmede olmasını beklemek ne kadar büyük bağlı ve kullanımı,) ben biliyorum iki seçenek.

Either:
Get all rows, like you do now, and sort it out with php, with something like:

$result = array();
foreach( $rowset as $row )
{
    // if the parent row is not present in the result array (assuming col1 is PK)
    if( !isset( $result[ $row[ 'col1' ] ) )
    {
        // create it, and make arrays of col8 and col9
        $result[ $row[ 'col1' ] ] = array(
            'col1' => $row[ 'col1' ],
            'col2' => $row[ 'col2' ],
            'col3' => $row[ 'col3' ],
            'col4' => $row[ 'col4' ],
            'col5' => $row[ 'col5' ],
            'col6' => $row[ 'col6' ],
            'col7' => $row[ 'col7' ],
            'col8' => array( $row[ 'col8' ] ),
            'col9' => array( $row[ 'col9' ] )
        )
    }
    else
    {
        // the parent row is present, so push values in col8 and col9 arrays
        $result[ $row[ 'col1' ] ][ 'col8' ][] = $row[ 'col8' ];
        $result[ $row[ 'col1' ] ][ 'col9' ][] = $row[ 'col9' ];
    }
}

Or:
Make more trips to the database, by first selecting the unjoined rows, and loop trough these rows and select the child rows for them.

Yani, sonuç: Eğer gerçekten sadece DB bir gezi istiyorsanız, ilk seçeneği tek seçenek olduğu (bildiğim kadarıyla).

PS:
Other options would probably be Stored Procedures or Views, but I don't have enough experience with them to give you good examples of them, especially Views (not even sure Views can be used for these purposes).

Ama saklı yordam yarar sanırım DB tek bir yolculuk olacaktır.