MySQL选择与变量相关的所有值(如果提供),或者选择所有内容(包括空)(如果未提供)

时间:2017-09-08 12:23:48

标签: php mysql

我正在尝试根据MySQL查询的输出创建数据数组。

我希望用户能够从下拉框中指定他们的城市,在这种情况下,只能为相关城市返回条目。

重要的是,如果用户没有选择城市(即将其留空),我希望他们看到所有数据,而不是 none 数据。

我的代码

    // Parameters for order
    $ordercity = ( ! empty( $_GET['city'] ) ) ? $_GET['city'] : '%'; // Set a wildcard if not provided
    $exclstatus   = 'wc-refunded'; // Set any excluded statuses

    // Get the order details
    $orderdata = $wpdb->get_results( "
        SELECT 
        posts.post_status,
        posts.id as post_id,
        meta1.meta_value AS city, 
        meta2.meta_value AS company,
        meta3.meta_value AS email
        FROM 
        wp2_posts posts,
        wp2_postmeta meta1,
        wp2_postmeta meta2,
        wp2_postmeta meta3
        WHERE posts.ID = meta1.post_id    
            AND posts.post_status NOT LIKE '$exclstatus'
            AND meta1.meta_key LIKE '_billing_city'
            AND meta1.meta_value LIKE '$ordercity'
            AND meta1.post_id = posts.id
            AND meta2.meta_key LIKE '_billing_company'
            AND meta2.post_id = posts.id
            AND meta3.meta_key LIKE '_billing_email'
            AND meta3.post_id = posts.id
    ", ARRAY_A );

我当前方法的局限性

我目前的方法是使用'%'来填充$ ordercity。如果没有设置城市,则使用通配符。

这是有限的,因为只选择了具有_billing_city值(即,不是空的)的记录。

我的研究

这个建议使用条件的Stack Overflow post很有意思,但它需要我有两个非常相似的查询(一个有AND meta1.meta_value LIKE '$ordercity'而另一个没有)这似乎是不必要的,如果我有可能很长有多个变量。

我还在SQL Wildcards上查看了W3学校的建议,但是我没有看到任何关于通配符的指导,如果它是“什么都没有”,那就会选择该字段

3 个答案:

答案 0 :(得分:1)

肮脏技巧。 您的查询是一个字符串。

if ($city != "") $wheee = "AND city = 'whatever' ";

[...]
WHERE posts.ID = meta1.post_id ".$wheee."   
    AND posts.post_status NOT LIKE '$exclstatus'
    AND meta1.meta_key LIKE '_billing_city'
[...]

答案 1 :(得分:0)

为什么不添加OR条件

AND (meta1.meta_value LIKE '$ordercity' OR meta1.meta_value IS NULL)

答案 2 :(得分:0)

我已经想出了一个答案,这个答案的灵感来自Rahul的建议。

基本上,如果没有设置参数,我使用PHP将其设置为''。然后在SQL中,如果该参数设置为''我继续,如果不是,我使用该参数

// Parameters for order - if it isn't set, set it to ''
$ordercompany = ( ! empty( $_GET['company'] ) ) ? $_GET['company'] : '';
$exclstatus   = 'wc-refunded'; // Set any excluded statuses


// Get the order details
$orderdata = $wpdb->get_results( "
    SELECT 
    posts.post_status,
    posts.id as post_id,
    meta1.meta_value AS company, 
    meta2.meta_value AS city,
    meta3.meta_value AS email
    FROM 
    wp2_posts posts,
    wp2_postmeta meta1,
    wp2_postmeta meta2,
    wp2_postmeta meta3
    WHERE posts.ID = meta1.post_id    
        AND posts.post_status NOT LIKE '$exclstatus'
        AND meta1.meta_key LIKE '_billing_company'
        // This is the important bit!
        AND ('$ordercompany = '' OR meta1.meta_value LIKE '$ordercompany')
        AND meta1.post_id = posts.id
        AND meta2.meta_key LIKE '_billing_city'
        AND meta2.post_id = posts.id
        AND meta3.meta_key LIKE '_billing_email'
        AND meta3.post_id = posts.id
", ARRAY_A );