Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Fasih dimana dengan bergabung dengan beberapa tabel

Perhatikan bahwa cara Anda mencoba melakukannya, Anda mungkin mendapatkan beberapa baris per item (sekali per daftar terkait). Cara yang lebih baik adalah dengan memiliki daftar daftar per item.

Jika Anda menggunakan model fasih dan Anda telah mengatur hubungan dengan benar, Anda dapat mencoba yang berikut ini:

$cats = [1, 2, 3];

$query = Item::with('listings');
foreach ($cats as $cat) {
    $query->whereHas('catitems', function($q) use($cat) {
        $q->where('id', $cat);
    });
}
$items = $query->get();

Sekarang setiap item harus memiliki listings Properti. Misalnya untuk item pertama Anda dapat mengakses listingan dengan cara berikut:

$item1 = $items[0];
$listings1 = $item1->listings;

Perhatikan bahwa whereHas() mungkin akan membuat EXISTS yang berkorelasi subquery untuk setiap entri di $cats Himpunan. Jika itu lambat, Anda dapat menggunakan kueri GABUNG seperti:

$items = Item::with('listings')
    ->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
    ->whereIn('catitem_item.catitem_id', $cats)
    ->groupBy('items.id')
    ->having(DB::raw('count(*)'), '=', count($cats))
    ->select('items.*')
    ->get();

Jika Anda tidak menggunakan fasih, Anda juga dapat melakukan "pemuatan bersemangat" sendiri.

$items = DB::table('items')
    ->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
    ->whereIn('catitem_item.catitem_id', $cats)
    ->groupBy('items.id')
    ->having(DB::raw('count(*)'), '=', count($cats))
    ->select('items.*')
    ->get()
    ->keyBy('id');

foreach ($items as $item) {
    $item->listings = [];
}

$itemIds = $items->pluck('id');
$listings = DB::table('listings')
    ->join('item_listing', 'item_listing.listing_id', '=', 'listings.id')
    ->whereIn('item_listing.item_id', $itemIds)
    ->groupBy('listings.id')
    ->select('listings.*', DB::raw('group_concat(item_listing.item_id) as item_ids'))
    ->get();

foreach ($listings as $listing) {
    $itemIds = explode(',', $listing->item_ids);
    foreach ($itemIds as $itemId) {
        $items[$itemId]->listings[] = $listing;
    }
    $listing->forget('item_ids');
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolom waktu SQL tidak mengurutkan dalam urutan menaik

  2. Mendapatkan jumlah baris dan data dari baris itu dalam satu kueri menggunakan PDO di PHP

  3. Pembuat kueri Doctrine/Symfony tambahkan pilih di gabung kiri

  4. Gabung tabel dalam dua database menggunakan SQLAlchemy

  5. Entri SQL yang kedaluwarsa setelah 24 jam