【问题标题】:How to write PHP code inside MySQL query如何在 MySQL 查询中编写 PHP 代码
【发布时间】:2014-03-05 09:17:42
【问题描述】:

我很困惑如何在 MySQL 查询中创建循环。

我有这个问题:

<?php
    $arr = explode(',', $features);
    $query_spicy = "
    SELECT wposts.*             
        FROM $wpdb->posts wposts
    INNER
        JOIN ( SELECT post_id
               FROM $wpdb->postmeta wpostmeta
                    WHERE ('; 
                                ( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '%test1%' )
                            OR 
                                ( wpostmeta.meta_key = 'features'AND wpostmeta.meta_value LIKE '%test2%' )
                            OR 
                                ( wpostmeta.meta_key = 'features'AND wpostmeta.meta_value LIKE '%test3%' )
                            OR
                                ( wpostmeta.meta_key = 'features'AND wpostmeta.meta_value LIKE '%test4%' )
                            OR
                                ( wpostmeta.meta_key = 'features'AND wpostmeta.meta_value LIKE '%test5%' )
                    ')
                    GROUP BY post_id
            ) AS t ON t.post_id = wposts.ID WHERE wposts.post_status = 'publish' AND wposts.post_type = 'book' ORDER BY wposts.post_date DESC";
?>

我想用 for 循环生成波纹管部分动态:

( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '%test1%' ) OR 
( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '%test2%' ) OR 
( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '%test3%' ) OR
( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '%test4%' ) OR
( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '%test5%' )

注意:test1、test2、test3、test4 和 test5,我是从这个$arr 得到的。

希望您能理解我的问题,如果您能帮助我,我将不胜感激。

谢谢:)

【问题讨论】:

  • 为什么要这样做?当然可以完全实现您的要求,但我觉得可能有比这更好的方法来做您想做的事情。

标签: php mysql sql


【解决方案1】:

试试类似的东西

$arr = explode(',', $features);
$conditions = array();

foreach($arr as $feature){
    $condition[] = "( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '{$feature}' )";
}
$query = "SELECT ...". join("OR",$conditions);

但您可以简单地执行 wpostmeta.meta_key = 'feature' 和 wpostmet IN($features) 之类的操作

我认为第二种解决方案更好更快。

【讨论】:

  • 您好,谢谢您的回答,但您能否指导我提供完整的解释。谢谢。
  • 首先这里是 mysql 语句的更多信息:w3schools.com/sql/sql_like.asp 好的,我假设您已经有了一个功能列表,并用逗号连接(不要忘记在其中添加 ')。因此,您需要创建一个如下所示的查询: ...continue after while
  • SELECT post_id FROM $wpdb->postmeta wpostmeta WHERE wpostmeta.meta_key = 'features' AND meta_value IN ($feature) 你也可以看到 INSTR function dev.mysql.com/doc/refman/5.0/en/…
【解决方案2】:

试试这个

wpostmeta.meta_key = ".$features." AND wpostmeta.meta_value LIKE '%test1%'

【讨论】:

    【解决方案3】:
    <?php
        $arr = explode( ',', $features );
    
        $query_spicy = "
        SELECT wposts.*             
            FROM {$wpdb->posts wposts}
        INNER
            JOIN ( SELECT post_id
                   FROM {$wpdb->postmeta wpostmeta}
                        WHERE (";
    
        $tmp = array();
        foreach( $arr as $value )
        {
            $tmp[] = "( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '%{$value}%' )";
        }
    
        $query_spicy .= implode( ' OR ', $tmp );
        $query_spicy .= ")
                        GROUP BY post_id
                ) AS t ON t.post_id = wposts.ID WHERE wposts.post_status = 'publish' AND wposts.post_type = 'book' ORDER BY wposts.post_date DESC";
    ?>
    

    【讨论】:

      【解决方案4】:

      FWIIW:

      只需设置一个数组来包含您需要插入的数据,然后使用 foreach 循环遍历它。

      $sql="SELECT wposts.*             
              FROM $wpdb->posts wposts
          INNER
              JOIN ( SELECT post_id
                     FROM $wpdb->postmeta wpostmeta
                          WHERE ('; ";
      foreach($arrayoftestdata as $test)
          {
          $sql.="( wpostmeta.meta_key = 'features' AND wpostmeta.meta_value LIKE '%$test%' ) OR ";
          }
      
      $sql.="')
                          GROUP BY post_id
                  ) AS t ON t.post_id = wposts.ID WHERE wposts.post_status = 'publish' AND wposts.post_type = 'book' ORDER BY wposts.post_date DESC";
      

      【讨论】:

        猜你喜欢
        • 2021-11-04
        • 1970-01-01
        • 2014-12-23
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多