MySQL在左连接中选择最后一个图像


MySQL select last image in LEFT JOIN

我有这个函数,它列出了第一个插入的图像和住宿数据库中的其他数据。

function getLIST($sort_by,$saved=0,$filter)
{
    $session = JFactory::getSession();
    $lang =& JFactory::getLanguage();
    $query = "SELECT a.id FROM #__jomholiday_fields AS a where a.name='COM_JOMHOLIDAY_ACCOMODATION_RATING'";
    $db = $this->getDbo();
    $db->setQuery( $query );
    $rating_id = $db->loadResult();
    $query = "SELECT a.id FROM #__jomholiday_fields AS a where a.name='COM_JOMHOLIDAY_BOARD_BASIS'";
    $db->setQuery( $query );
    $board_basis_id = $db->loadResult();
    $query  = $db->getQuery(true);
    $listing_expiry_days=(int)$this->getConf("listing_expiry_days");
    if($listing_expiry_days)
    {
        $now=strtotime("now");
        $temp=$now-$listing_expiry_days*(60*60*12);
        $toold=date('Y-m-d',$temp);
    }
    else $toold=0;
    $search_mod=0;
    $query->select(
        $this->getState(
            'list.select',
            'a.id, a.categories_id, a.number, a.headline, a.short_description, a.lat, a.lon, a.published, a.dpublished' .
            ', a.featured, a.address_name, a.created, a.modified, p.name , a.price_night, a.price_week, a.sleeps'
        )
    );
    $query->from('#__jomholiday_listings AS a');
    $query->select('p.name AS image');
    $query->select('MAX(p.id)');
    $query->join('LEFT', '#__jomholiday_photos AS p ON p.listings_id = a.id AND (p.rooms_id=0 OR p.rooms_id IS NULL)  ');
    $query->select('ac.name AS category_name');
    $query->select('ac.rental AS price_type');
    $query->join('LEFT', '#__jomholiday_categories AS ac ON ac.id = a.categories_id');
    $query->where("(ac.lang='".$lang->getTag()."' OR ac.lang='*')");
    //$query->where("p.id = MAX(p.id)");
    $query->select('AVG(r.rating) AS rating_average');
    $query->join('LEFT', '#__jomholiday_reviews AS r ON r.published="1" AND r.listingid=a.id');
    if ($rating_id){    
        $query->select('f1.value AS accomodation_rating');
        $query->join('LEFT', '#__jomholiday_listings_to_fields AS f1 ON f1.listings_id = a.id AND f1.fields_id='.$rating_id.'');
    }
    if ($board_basis_id){   
        $query->select('f2.value AS all_inclusive');
        $query->join('LEFT', '#__jomholiday_listings_to_fields AS f2 ON f2.listings_id = a.id AND f2.fields_id='.$board_basis_id.' and f2.value="COM_JOMHOLIDAY_ALL_INCLUSIVE"');
        $query->select('f3.value AS bed_breakfast');
        $query->join('LEFT', '#__jomholiday_listings_to_fields AS f3 ON f3.listings_id = a.id AND f3.fields_id='.$board_basis_id.' and f3.value="COM_JOMHOLIDAY_BED_BREAKFAST"');
        $query->select('f4.value AS full_board');
        $query->join('LEFT', '#__jomholiday_listings_to_fields AS f4 ON f4.listings_id = a.id AND f4.fields_id='.$board_basis_id.' and f4.value="COM_JOMHOLIDAY_FULL_BOARD"');
        $query->select('f5.value AS half_board');
        $query->join('LEFT', '#__jomholiday_listings_to_fields AS f5 ON f5.listings_id = a.id AND f5.fields_id='.$board_basis_id.' and f5.value="COM_JOMHOLIDAY_HALF_BOARD"');
        $query->select('f6.value AS room_only');
        $query->join('LEFT', '#__jomholiday_listings_to_fields AS f6 ON f6.listings_id = a.id AND f6.fields_id='.$board_basis_id.' and f6.value="COM_JOMHOLIDAY_ROOM_ONLY"');
        $query->select('f7.value AS self_cattering');
        $query->join('LEFT', '#__jomholiday_listings_to_fields AS f7 ON f7.listings_id = a.id AND f7.fields_id='.$board_basis_id.' and f7.value="COM_JOMHOLIDAY_SELF_CATTERING"');
    }
    if ($saved)
    {
        $cids=JRequest::getString('savedlist', '', 'cookie');
        $cid=explode(",",$cids);
        JArrayHelper::toInteger($cid);
        $cids=implode(",",$cid);
        $query->where('a.id IN ( '. $cids .' )');
        $search_mod=1;
    }
    $query->where("a.published='1'");
    $query->where("a.approved='1'");
    if ($toold) $query->where("a.dpublished>'$toold'");
    if ($session->get('jom_zlat')!=null)
    {
        $lat1=(float)$session->get('jom_lat')-$session->get('jom_zlat');
        $lat2=(float)$session->get('jom_lat')+$session->get('jom_zlat');
        $lon1=(float)$session->get('jom_lon')-$session->get('jom_zlon');
        $lon2=(float)$session->get('jom_lon')+$session->get('jom_zlon');
        if ($lat1>$lat2){$temp=$lat1;$lat1=$lat2;$lat2=$temp;}
        if ($lon1>$lon2){$temp=$lon1;$lat1=$lon2;$lon2=$temp;}
        if ($lat1) $query->where("a.lat>".$lat1);
        if ($lat2) $query->where("a.lat<".$lat2);
        if ($lon1) $query->where("a.lon>".$lon1);
        if ($lon2) $query->where("a.lon<".$lon2);
        $search_mod=1;
    }
    if ($session->get('jom_address_select')!=null)
    {
        $temp=explode(",",$session->get('jom_address_select'));
        if ($temp[0]) $temp1=$this->getRegion((int)$temp[0]);
        if ($temp[1]) $temp1.=", ".$this->getRegion((int)$temp[1]);
        if ($temp[2]) $temp1.=", ".$this->getRegion((int)$temp[2]);
        $query->where("(a.address_name like '%".str_replace("'","''",$temp1)."%')", ENT_QUOTES);
        $search_mod=1;
    }
    if (str_replace(",","",$session->get('jom_booking')))
    {
        $temp=explode(",",$session->get('jom_booking'));
        if ($temp[0] && $temp[2]>0)
        {
            $in=strtotime($temp[0]);
            $out=strtotime($temp[1]);
            $query->where("a.sleeps >= '".(int)$temp[2]."'");
            while ($in<$out)
            {
                $query->where("(a.booking LIKE '%,".date("ymd",$in)."-".(int)$temp[2].",%' OR a.booking NOT LIKE '%,".date("ymd",$in)."-%' OR a.booking IS NULL)");
                $in=strtotime('+1 day', $in);
            }
        }
        $search_mod=1;
    }
    if ((int)$session->get('jomholiday_search_cat'))
    {
        $temp=explode(",",$session->get('jomholiday_search_cat'));
        JArrayHelper::toInteger($temp);
        $cidss = implode( ',', $temp );
        $query->where("a.categories_id IN ( ". $cidss ." )");
        $search_mod=1;
    }
    if ($session->get('jom_title')!=null){$search_mod=1; $query->where("(a.headline like '%".str_replace("'","''",$session->get('jom_title'))."%' OR a.address_name like '%".str_replace("'","''",$session->get('jom_title'))."%')", ENT_QUOTES);}
    if ((int)$session->get('jom_pricemin')!=null){$search_mod=1; $query->where("a.price_night>=".(int)$session->get('jom_pricemin'));}
    if ((int)$session->get('jom_pricemax')!=null) {$search_mod=1;$query->where("a.price_night<=".(int)$session->get('jom_pricemax'));}
    if ($session->get('jomholiday_search'))
    {
        $val=json_decode($session->get('jomholiday_search'),true);
        if (is_array($val))
        {
            $array_keys = array_keys($val);
            foreach($array_keys as $key) if ($val[$key]!=null)
            {
                    if (is_array($val[$key]))
                    {
                        $array_keys1 = array_keys($val[$key]);
                        foreach($array_keys1 as $key1)
                        {
                            $val[$key][$key1]=htmlspecialchars($val[$key][$key1],ENT_QUOTES);
                            $query->where('exists(select 1 from #__jomholiday_listings_to_fields AS fs'.$key.'_'.$key1.' where fs'.$key.'_'.$key1.'.listings_id = a.id AND fs'.$key.'_'.$key1.'.value="'.$val[$key][$key1].'" and fs'.$key.'_'.$key1.'.fields_id='.$key.')');
                        }
                    }
                    else if (trim($val[$key])!=null)
                    {
                        $val[$key]=htmlspecialchars(trim($val[$key]),ENT_QUOTES);
                        $query->where('exists(select 1 from #__jomholiday_listings_to_fields AS fs'.$key.' where fs'.$key.'.listings_id = a.id AND fs'.$key.'.value="'.$val[$key].'" and fs'.$key.'.fields_id='.$key.')');
                    }
            }
            $search_mod=1;
        }
    }
    if ((int)JRequest::getVar('cid') && !$search_mod) $query->where("a.categories_id='".(int)JRequest::getVar('cid')."'");
    if ((int)$session->get('jom_pricemin_f')!=null) $query->where("a.price_night>=".(int)$session->get('jom_pricemin_f'));
    if ((int)$session->get('jom_pricemax_f')!=null) $query->where("a.price_night<=".(int)$session->get('jom_pricemax_f'));
    if ($session->get('jomholiday_filter'))
    {
        $val=json_decode($session->get('jomholiday_filter'),true);
        if (is_array($val))
        {
            $array_keys = array_keys($val);
            foreach($array_keys as $key) if ($val[$key]!=null)
            {
                    if (is_array($val[$key]))
                    {
                        $array_keys1 = array_keys($val[$key]);
                        foreach($array_keys1 as $key1)
                        {
                            $val[$key][$key1]=htmlspecialchars($val[$key][$key1],ENT_QUOTES);
                            $query->where('exists(select 1 from #__jomholiday_listings_to_fields AS fsf'.$key.'_'.$key1.' where fsf'.$key.'_'.$key1.'.listings_id = a.id AND fsf'.$key.'_'.$key1.'.value="'.$val[$key][$key1].'" and fsf'.$key.'_'.$key1.'.fields_id='.$key.')');
                        }
                    }
                    else if (trim($val[$key])!=null)
                    {
                        $val[$key]=htmlspecialchars(trim($val[$key]),ENT_QUOTES);
                        $query->where('exists(select 1 from #__jomholiday_listings_to_fields AS fsf'.$key.' where fsf'.$key.'.listings_id = a.id AND fsf'.$key.'.value="'.$val[$key].'" and fsf'.$key.'.fields_id='.$key.')');
                    }
            }
        }
    }
    if ($session->get('jom_address')!=null) $query->where("a.address_name like '".str_replace("'","''",$session->get('jom_address'))."%'", ENT_QUOTES);
    $query->group("a.id");
    if ($this->getState('sort_by')=="a.created DESC") $order_s=$this->getState('sort_by');
    elseif ($this->getState('sort_by')=="a.modified DESC") $order_s=$this->getState('sort_by');
    elseif ($this->getState('sort_by')=="a.price_night DESC") $order_s=$this->getState('sort_by');
    elseif ($this->getState('sort_by')=="a.price_night") $order_s=$this->getState('sort_by');
    elseif ($this->getState('sort_by')=="a.headline") $order_s=$this->getState('sort_by');
    else $order_s="";
    if ($this->getConf(premium_first))
    {
        if ($order_s && JRequest::getVar('task')!='rss') $query->order("a.featured desc, ".$order_s.",id desc");
        else $query->order("a.featured desc, a.created DESC, id desc");
    }
    else
    {
        if ($order_s && JRequest::getVar('task')!='rss') $query->order($order_s.",id desc");
        else $query->order("a.created DESC, id desc");
    }
    if ($saved || JRequest::getVar('task')=='rss') $data = $this->_getList($query);
    else $data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit'));
    //echo $query;
    return $data;   
}

我需要从表#__jomholiday_photos中检索最后插入的图像。正如你所看到的,我确实试图把MAX(p.id),但这没有帮助。我确实试着把$query->顺序("p。id DESC");,这也没有帮助。

更新:下面是使用以下代码生成的查询

SELECT a.id, a.categories_id, a.number, a.headline, a.short_description, a.lat, a.lon,
 a.published, a.dpublished, a.featured, a.address_name, a.created, a.modified,
 p.name , a.price_night, a.price_week, a.sleeps,p.name AS image,MAX(p.id),ac.name AS category_name,
 ac.rental AS price_type,AVG(r.rating) AS rating_average,f1.value AS accomodation_rating,
 f2.value AS all_inclusive,f3.value AS bed_breakfast,f4.value AS full_board,f5.value AS half_board,
 f6.value AS room_only,f7.value AS self_cattering 
 FROM #__jomholiday_listings AS a 
 LEFT JOIN #__jomholiday_photos AS p ON p.listings_id = a.id AND (p.rooms_id=0 OR p.rooms_id IS NULL)  
 LEFT JOIN #__jomholiday_categories AS ac ON ac.id = a.categories_id 
  LEFT JOIN #__jomholiday_reviews AS r ON r.published="1" AND r.listingid=a.id 
  LEFT JOIN #__jomholiday_listings_to_fields AS f1 ON f1.listings_id = a.id 
  AND f1.fields_id=22
  LEFT JOIN #__jomholiday_listings_to_fields AS f2 ON f2.listings_id = a.id 
  AND f2.fields_id=10 
  and f2.value="COM_JOMHOLIDAY_ALL_INCLUSIVE" LEFT JOIN #__jomholiday_listings_to_fields AS f3 
  ON f3.listings_id = a.id AND f3.fields_id=10 and f3.value="COM_JOMHOLIDAY_BED_BREAKFAST" 
  LEFT JOIN #__jomholiday_listings_to_fields AS f4 ON f4.listings_id = a.id 
  AND f4.fields_id=10 
  and f4.value="COM_JOMHOLIDAY_FULL_BOARD" LEFT JOIN #__jomholiday_listings_to_fields AS f5 
  ON f5.listings_id = a.id AND f5.fields_id=10 and f5.value="COM_JOMHOLIDAY_HALF_BOARD" 
  LEFT JOIN #__jomholiday_listings_to_fields AS f6 ON f6.listings_id = a.id 
   AND f6.fields_id=10 
  and f6.value="COM_JOMHOLIDAY_ROOM_ONLY" LEFT JOIN #__jomholiday_listings_to_fields AS f7 
  ON f7.listings_id = a.id AND f7.fields_id=10 and f7.value="COM_JOMHOLIDAY_SELF_CATTERING" 
  WHERE (ac.lang='hr-HR' OR ac.lang='*') 
  AND a.published='1' AND a.approved='1' 
    GROUP BY a.id 
   ORDER BY a.featured desc,    a.headline,id desc LIMIT 0, 15

'p.name'从'#__jomholiday_photos'中检索第一条记录。我需要每个清单的最后一个。

我发现了如何通过替换以下代码来获得最后一张图像:

 $query->join('LEFT', '#__jomholiday_photos AS p ON p.listings_id = a.id AND (p.rooms_id=0 OR p.rooms_id IS NULL)   ');

和这个:

$query->join('LEFT', '( SELECT MAX(id) as maxpid , name, listings_id, rooms_id FROM #__jomholiday_photos GROUP BY id ORDER BY id DESC) AS p ON p.listings_id = a.id AND (p.rooms_id=0 OR p.rooms_id IS NULL)   ');