sql >> Databasteknik >  >> RDS >> Mysql

Vältalande där med sammanfoga flera bord

Observera att på det sätt du försöker göra det kan du få flera rader per objekt (en gång per relaterad lista). Ett bättre sätt skulle vara att ha en rad listor per artikel.

Om du använder vältaliga modeller och du har ställt in relationerna korrekt kan du prova följande:

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

Nu ska varje objekt ha en listings fast egendom. Till exempel för det första objektet kan du komma åt listorna på följande sätt:

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

Observera att whereHas() kommer förmodligen att skapa en korrelerad EXISTS underfråga för varje post i $cats array. Om det är för långsamt kan du använda en JOIN-fråga som:

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

Om du inte använder vältalig kan du också göra "ivriga laddningar" själv.

$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. MySQL-fråga med villkorligt uttalande?

  2. Vad är skillnaden mellan utf8_general_ci och utf8_unicode_ci?

  3. Designa en databas för ett rekryteringssystem

  4. MYSQL, mycket långsam ordning efter