【问题标题】:Sorting by group is not working wordpress sql按组排序不起作用wordpress sql
【发布时间】:2018-08-14 16:17:55
【问题描述】:

似乎按组排序不适用于这个。

变量 $check_all 用于显示所有属性。

$check_all=$wpdb->get_results("select distinct town_village, suburb, state from $table where (concat(suburb,', ',state,', ',postcode)='$value' or concat(suburb,', ',postcode)='$value' or concat(suburb,', ',state,' ',postcode)='$value' or concat(suburb,', ',state)='$value' or CONCAT(town_village,', ',state) like '%$value%') Group by suburb,town_village,state", ARRAY_A);

然后我有这段代码通过搜索输入过滤输出。

$sql_keywords.= "properties.town_village in ('".$check_all[0]['town_village']."') AND properties.state in ('".$check_all[0]['state']."') AND ";

例如,结果必须是这样的,所有郊区“马尼拉”必须首先显示。 请看截图http://prntscr.com/inpgjn

但我得到的结果是随机的。搜索郊区显示在结果中的随机位置。

已编辑:这是我上面显示的代码的当前结果

按“马尼拉”搜索 http://prntscr.com/inppj8

当他们搜索“马尼拉”时,我想要的结果是首先显示所有马尼拉的结果http://prntscr.com/inpgjn

请查看此函数的代码

function lookup_string($value, $sql_keywords, $sur_suburbs='0'){
        global $wpdb;
        $suburb_region=$wpdb->get_results("show columns from suburb_region");
        $table=($suburb_region)?'suburb_region':'properties';
        if($sur_suburbs==1){
            if(strpos($value,',')!==false){
                $check_all=$wpdb->get_results("select distinct town_village, suburb, state from $table where (concat(suburb,', ',state,', ',postcode)='$value' or concat(suburb,', ',postcode)='$value' or concat(suburb,', ',state,' ',postcode)='$value' or concat(suburb,', ',state)='$value' or CONCAT(town_village,', ',state) like '%$value%') Group by suburb,town_village,state", ARRAY_A);
                $check_suburb=$wpdb->get_var("select distinct suburb from $table where CONCAT(suburb,', ',state, ', ',postcode) like '%$value%'");
            }   
            if($check_all){

                $sql_keywords.= "properties.town_village in ('".$check_all[0]['town_village']."') AND properties.state in ('".$check_all[0]['state']."') AND ";
            }
        }
    }

如下所示的预期查询顺序。现在我正在随机进入郊区。


suburb | state |
----------------------
Manila | Metro |
Manila | Metro |
Manila | Metro |
Manila | Metro |
Pasay  | Metro |
Makati | Metro |
ETC    | Metro |

【问题讨论】:

  • “按组排序” - 您的查询中没有排序依据?
  • 我在 $check_all 的最后一部分“按郊区、城镇村、州分组”添加了它,不知道我是否做得对...
  • 您的代码不完整,并且..您的问题不清楚..如果您有错误,请显示真正相关的代码和错误消息
  • @scaisEdge 实际上我没有收到任何错误,它随机显示结果,但没有按我想要的那样显示...请查看问题的屏幕截图。这就是我想要的结果..
  • GROUP BY 排序。如果要排序,需要使用ORDER BY....

标签: php mysql wordpress sorting


【解决方案1】:

一种强制特定结果在排序顺序中排在第一位的方法是在ORDER BY 子句中使用CASE 语句,如下所示:

ORDER BY CASE `suburb`
    WHEN 'Manilla' THEN 'aaaaaaaa'
    ELSE `suburb` END, `state`

这是你的函数,其中有几个修订:

  1. 使用$wpdb->准备使用preventing SQL injection attacks的“WordPress方式”。
  2. 给代码一些格式(间距)以提高可读性。这是recommended by WordPress also
  3. 对 SQL 中的保留字(SELECT、FROM、OR、CONCAT 等)使用 UPPERCASE 也有助于提高可读性。
  4. 在 PHP 中使用 UPPERCASE 表示 TRUE / FALSE 等。
  5. 将您的条件切换为 Yoda style 以进行防御性编码。
  6. $wpdb->get_row() 用于$check_all,因为您只关心第一个结果/行。

您的代码,已修改:

function lookup_string( $value, $sql_keywords, $sur_suburbs = 0 ) {
    global $wpdb;
    $suburb_region = $wpdb->get_results( "SHOW COLUMNS FROM suburb_region" );
    $table=( $suburb_region ) ? 'suburb_region' : 'properties';

    if( (int)$sur_suburbs ) {
        // Your use of $check_all below will throw notices without this
        $check_all = FALSE;
        if( FALSE !== strpos( $value, ',' ) ) {
            // this is how you format "LIKE" queries using $wpdb->prepare
            $like = "%{$value}%";

            // To prevent SQL injection, use $wpdb->prepare
            $prepared = $wpdb->prepare( "SELECT distinct town_village, suburb, state 
                FROM {$table} 
                    WHERE (CONCAT(suburb, ', ', state, ', ', postcode)=%s 
                    OR CONCAT(suburb, ', ', postcode)=%s 
                    OR CONCAT(suburb, ', ', state,' ', postcode)=%s 
                    OR CONCAT(suburb, ', ', state)=%s 
                    OR CONCAT(town_village, ', ' ,state) LIKE %s) 
                    GROUP BY suburb, town_village, state 
                    ORDER BY CASE `suburb`
                        WHEN 'Manilla' THEN 'aaaaaaaa'
                        ELSE `suburb` END, state",
            $value, $value, $value, $value, $like);
            // execute the prepared query
            // Use get_row to get a single row
            $check_all = $wpdb->get_row( $prepared );

            // To prevent SQL injection, use $wpdb->prepare
            $prepared = $wpdb->prepare( "SELECT DISTINCT suburb FROM $table WHERE CONCAT(suburb, ', ', state, ', ', postcode) LIKE %s", $like );
            // execute the prepared query
            $check_suburb = $wpdb->get_var( $prepared );
        }  

        if( $check_all ) {
            // modified $check_all to use object notation, since using get_row above
            $sql_keywords.= "properties.town_village IN ('". $check_all->town_village ."') AND properties.state IN ('" . $check_all->state . "') AND ";
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多