2013-03-08 38 views
0

我已经在我的文件下面的查询:多左联接和ORDER BY

function getItems($ShowFeatured,$OrderBy,$Order,$amountShow,$ShowPropertyID) 

{   
switch($OrderBy) { 
case 0 : 
$OrderBy = 'p.id'; 
break; 
case 1 : 
$OrderBy = 'p.name'; 
break; 
case 2 : 
$OrderBy = 'p.price'; 
break; 
case 3 : 
$OrderBy = 'p.hits'; 
break; 
case 4 : 
$OrderBy = 'p.refresh_time'; 
break; 
} 
switch($Order) { 
case 0 : 
$Order = 'ASC'; 
break; 
case 1 : 
$Order = 'DESC'; 
break; 
} 
if($ShowPropertyID){$where= 'WHERE p.id IN ('.$ShowPropertyID.')';}else{$where=  'WHERE p.published = 1 ';} 
    if($ShowFeatured){$sqlFeatured= ' AND p.featured = 1';} 
    $db = &JFactory::getDBO();  
    $query = 'SELECT p.*, i.name as imagename,c.id as key1,c.name as name_category,t.id as key5,t.name as name_type,cy.id as key2,cy.name as name_country,s.id as key3,s.name as name_state,l.id as key4,l.name as name_locality,' 
      . ' CASE WHEN CHAR_LENGTH(p.alias) THEN CONCAT_WS(":", p.id, p.alias) ELSE p.id END as Pslug,' 
    . ' CASE WHEN CHAR_LENGTH(c.alias) THEN CONCAT_WS(":", c.id, c.alias) ELSE c.id END as Cslug,' 
    . ' CASE WHEN CHAR_LENGTH(cy.alias) THEN CONCAT_WS(":", cy.id, cy.alias) ELSE cy.id END as CYslug,' 
    . ' CASE WHEN CHAR_LENGTH(s.alias) THEN CONCAT_WS(":", s.id, s.alias) ELSE s.id END as Sslug,'  
    . ' CASE WHEN CHAR_LENGTH(l.alias) THEN CONCAT_WS(":", l.id, l.alias) ELSE l.id END as Lslug, ' 
    . ' CASE WHEN CHAR_LENGTH(t.alias) THEN CONCAT_WS(":", t.id, t.alias) ELSE t.id END as Tslug ' 
      . ' FROM #__properties_products AS p ' 
      . ' LEFT JOIN #__properties_country AS cy ON cy.id = p.cyid '    
      . ' LEFT JOIN #__properties_state AS s ON s.id = p.sid ' 
      . ' LEFT JOIN #__properties_locality AS l ON l.id = p.lid ' 
      . ' LEFT JOIN #__properties_category AS c ON c.id = p.cid ' 
      . ' LEFT JOIN #__properties_type AS t ON t.id = p.type ' 
      . ' LEFT JOIN #__properties_images AS i ON p.id = i.parent ' 
      . $where     
      . $sqlFeatured 
      . ' GROUP BY p.id ' 
      . ' ORDER BY '.$OrderBy.' '.$Order 
      . ' LIMIT '.$amountShow; 

    $db->setQuery($query); 
    $items = $db->loadObjectList(); 



    // $items = ($items = $db->loadObjectList())?$items:array(); 
//echo str_replace('#_','jos',$query); 


    return $items; 

部分获得的图像如下:

. ' LEFT JOIN #__properties_images AS i ON p.id = i.parent ' 

这个查询订单通过i.parent图像 - 图像我得到我不喜欢。在我的数据库中,我有行i.ordering - 是否有可能通过i.ordering在上面的查询上订购图像?

谢谢。

+0

,而不是使用MAX MIN该代码似乎需要一个参数的顺序,其中没有一个是对的i.parent列。如果你愿意,可以相对容易地向SWITCH语句添加额外的选项以通过i.ordering命令。 – Kickstart 2013-03-08 09:04:38

+0

不,图像只是一个片段 - 如果我将i.parent放入swistch选项,它只会重新排序来自数据库的结果,但图片仍然相同。问题是我有多个图像表... – user1810168 2013-03-08 09:26:43

+0

啊,对。有多个图像,但你只想要最新/最重要的一个返回。认为你需要为这些图像选择一个子选项。 – Kickstart 2013-03-08 09:28:43

回答

0

为你这样的事情查询我认为会做你想做的。

$query = 'SELECT p.*, i.name as imagename,c.id as key1,c.name as name_category,t.id as key5,t.name as name_type,cy.id as key2,cy.name as name_country,s.id as key3,s.name as name_state,l.id as key4,l.name as name_locality,' 
      . ' CASE WHEN CHAR_LENGTH(p.alias) THEN CONCAT_WS(":", p.id, p.alias) ELSE p.id END as Pslug,' 
    . ' CASE WHEN CHAR_LENGTH(c.alias) THEN CONCAT_WS(":", c.id, c.alias) ELSE c.id END as Cslug,' 
    . ' CASE WHEN CHAR_LENGTH(cy.alias) THEN CONCAT_WS(":", cy.id, cy.alias) ELSE cy.id END as CYslug,' 
    . ' CASE WHEN CHAR_LENGTH(s.alias) THEN CONCAT_WS(":", s.id, s.alias) ELSE s.id END as Sslug,'  
    . ' CASE WHEN CHAR_LENGTH(l.alias) THEN CONCAT_WS(":", l.id, l.alias) ELSE l.id END as Lslug, ' 
    . ' CASE WHEN CHAR_LENGTH(t.alias) THEN CONCAT_WS(":", t.id, t.alias) ELSE t.id END as Tslug ' 
      . ' FROM #__properties_products AS p ' 
      . ' LEFT JOIN #__properties_country AS cy ON cy.id = p.cyid '    
      . ' LEFT JOIN #__properties_state AS s ON s.id = p.sid ' 
      . ' LEFT JOIN #__properties_locality AS l ON l.id = p.lid ' 
      . ' LEFT JOIN #__properties_category AS c ON c.id = p.cid ' 
      . ' LEFT JOIN #__properties_type AS t ON t.id = p.type ' 
      . ' LEFT JOIN (SELECT parent, MAX(ordering) AS MostImportant FROM #__properties_images GROUP BY parent) x ON p.id = x.parent ' 
     . ' LEFT JOIN #__properties_images AS i ON x.parent = i.parent AND x.MostImportant = i.ordering ' 
      . $where     
      . $sqlFeatured 
      . ' GROUP BY p.id ' 
      . ' ORDER BY '.$OrderBy.' '.$Order 
      . ' LIMIT '.$amountShow; 

您可能要取决于哪种方式排序工作

+0

这不起作用......与p.id没有联系... – user1810168 2013-03-08 10:56:29

+0

哪里? P.id用于连接以与原始查询相同的方式获取所需的图像,并使用该属性中的x.parent id(应该是p.id)来加入以获取实际图像的详细信息 – Kickstart 2013-03-08 11:00:34