获得meta_value'在搜索匹配' post_id'和meta_key',' meta_value'二合一

时间:2017-09-07 16:32:01

标签: php mysql sql wordpress mysqli

postmeta table example

最终结果是匹配< post_id' 的数组,并按与会者人数排序。我知道它是一个WP后端,但我必须在SQL中执行它,没有' get_posts' 或任何与WordPress相关的内容。我想做的事情令人困惑,所以我会试着说清楚。

我必须开始的事情:

  • $ check_post_ids - 我需要检查的原始post_ids数组
  • $ start_date - 每个活动' meta_value' ' _StartDate' 需要匹配。

我需要做什么:

我需要检查这三个post_ids以查看它们是否具有匹配的开始日期。如果他们这样做,我需要从最高参与者数量到最低参与者数量排序的post_ids数组。

目前我计划用多个SELECT和foreach()语句来做这个,但我觉得必须有一个更简单的方法(即一个SELECT& foreach())。这就是我现在正在做的事情。我还没有完成它,因为我觉得必须有一个更简单的方法来做到这一点。更新的SQL和任何帮助非常感谢!

    $check_post_ids = array('484', '627', '982', '2435');       
    $start_date = '1963-10-20 19:30:00';            

    // iterate through array of post_ids and check if they have the same _StartDate
    foreach($check_post_ids as $id){
        $start_date_check = "SELECT * FROM `wp_postmeta` WHERE `post_id` =" . $id . " AND `meta_key` LIKE '_StartDate' AND `meta_value` = '" . $start_date . "'";
        $start_date_check_result = mysqli_query($conn, $start_date_check);

        // assign all post_ids with a matching _StartTime to a new array
        if (mysqli_num_rows($start_date_check_result) > 0) {
            while($row = mysqli_fetch_assoc($start_date_check_result)) {
                $matching_post_ids[] = $row['post_id'];

                // iterate through matching_post_ids array, get the _NumAttendees for each, and assign their id and _NumAttendees to an assoc array to be sorted
                foreach($matching_post_ids as $id){
                    $attendees_check = "SELECT meta_value FROM wp_postmeta WHERE post_id = " . $id . " AND meta_key = '_ecp_custom_2'";
                    $attendees_check_result = mysqli_query($conn, $attendees_check);
                    if($upvotes_check > 0){
                        while($row = mysqli_fetch_assoc($attendees_check_result)){
                            $sort_by_attendees['id'] = $id;
                            $sort_by_attendees['attendees'] = $row['meta_value'];
                            $sort_by_attendees_array[] = $sort_by_attendees;
                        }
                    }
                } 

1 个答案:

答案 0 :(得分:1)

对于查询的第一部分,我认为您可以使用SQL IN关键字来简化代码。基本上,它会将您的第一个数组的角色替换为所有帖子ID。然后,您可以编写如下的SQL查询:

SELECT meta_value 
FROM wp_postmeta 
WHERE meta_key = '_ecp_custom_2' 
AND post_id IN (SELECT post_id
FROM wp_postmeta 
WHERE post_id IN ('484', '627', '982', '2435')
AND meta_key LIKE '_StartDate' 
AND meta_value = '" . $start_date . "'")
ORDER BY meta_value DESC

有2个查询。括号中的第一个,在您的表wp_postmeta上选择所有po​​st id,其中post_ids在您的列表中有id,如果它们与您的开始日期匹配。然后,主查询根据您的第一个子查询(所有发布ID与您的开始日期)选择所有meta_values(我想是与会者)。

希望它会对你有所帮助。