繁体   English   中英

将两个不同的查询合并为一个合并的foreach

[英]combining two different queries into one merged foreach

我会尽力解释这一点。 我有两个查询从MySQL获取数据,一个查询获取公园评论数据,另一个查询获取骑行评论数据。 这两个查询均按“ Review Date排序。

我要在网页上显示的是按Review Date排序的Review Date列表之一,因此公园评论和乘车评论将混合在一起。

几乎就像运行两个foreach循环一样,每个查询一个,但是根据日期轮流进行。

这是两个查询:乘车

$query4= 'SELECT review_id, review, tpf_reviews_rides.user, DATE_FORMAT(date_ridden, "%d %M %Y") AS Date_Ridden, DATE_FORMAT(review_date, "%d %M %Y") AS Review_Date, tpf_rides.name AS ride_name, rating, tpf_parks.name  AS park_name, country
FROM tpf_reviews_rides  

INNER JOIN tpf_rides ON tpf_reviews_rides.ride_id = tpf_rides.ride_id
INNER JOIN tpf_ratings_rides ON tpf_reviews_rides.rating_link = tpf_ratings_rides.rating_id  
INNER JOIN tpf_parks ON tpf_reviews_rides.park_id = tpf_parks.park_id

ORDER BY review_date DESC, review_id DESC LIMIT '.$start_from.' , '.$limit.'';

对于公园:

$query5= 'SELECT review_id, review, tpf_reviews_parks.user, DATE_FORMAT(date_visited, "%d %M %Y") AS Date_Visited, DATE_FORMAT(review_date, "%d %M %Y") AS Review_Date, rating, tpf_parks.name, country
FROM tpf_reviews_parks  

INNER JOIN tpf_ratings_parks ON tpf_reviews_parks.rating_link = tpf_ratings_parks.rating_id  
INNER JOIN tpf_parks ON tpf_reviews_parks.park_id = tpf_parks.park_id

ORDER BY review_date DESC, review_id DESC LIMIT '.$start_from.' , '.$limit.'';

这是我分别显示结果的方式:对于乘车:

foreach ($res4 AS $row4) { 
            printf('
            <h2 style="display:inline;">%s</h2> <h3 style="display:inline;">- %s, %s</h3>
            <h3>Rating - %sStars</h3>
            <h4>Submitted by %s on %s</h4>
            <p>%s</p>' . PHP_EOL, $row4['ride_name'], $row4['park_name'], $row4['country'], $row4['rating'], (htmlspecialchars($row4['user'], ENT_QUOTES, 'UTF-8')), $row4['Review_Date'], nl2br(htmlspecialchars($row4['review'], ENT_QUOTES, 'UTF-8')));

            if(!empty($row4['Date_Ridden'])){
            printf('<p>Date ridden: %s</p>' . PHP_EOL, $row4['Date_Ridden']);
            }

            printf('<a class="bloglink" href="#top">Back to Top</a>
            <hr>');

        }


    For PArks:

foreach ($res5 AS $row5) { 
    printf('
    <h2 style="display:inline;">%s</h2> <h3 style="display:inline;">- %s</h3>
    <h3>Rating - %sStars</h3>
    <h4>Submitted by %s on %s</h4>
    <p>%s</p>' . PHP_EOL, $row5['name'], $row5['country'], $row5['rating'], (htmlspecialchars($row5['user'], ENT_QUOTES, 'UTF-8')), $row5['Review_Date'], nl2br(htmlspecialchars($row5['review'], ENT_QUOTES, 'UTF-8')));

    if(!empty($row4['Date_Ridden'])){
    printf('<p>Date Visited: %s</p>' . PHP_EOL, $row4['Date_Visited']);
    }

    printf('<a class="bloglink" href="#top">Back to Top</a>
    <hr>');

}

为了更复杂,在此页面上分页。 来看一下,因为如果有一种方法可以在查询级别进行合并,则这两个查询是如此相似,因此这将是最好的方法,并且有助于使分页代码保持完整。 有人对我如何实现这一目标有任何建议吗?

谢谢

您可以使用UNION将两个select语句合并在一起。

请注意,如果您的表是如此相似,则最好将它们合并(不是在查询中,而是在实际表中)。 tpf_reviews_rides相比,您在tpf_reviews_rides不到任何不完全相同的tpf_reviews_parks 添加一列表示评论类型(乘车或停车)的列,您将被设置。 它将简化您的查询和处理逻辑。

SELECT
    type,
    review_id,
    review,
    user,
    Date_Event,
    Review_Date,
    ride_name,
    rating,
    park_name,
    country
FROM (
    SELECT
        'ride' as type,
        review_id,
        review,
        tpf_reviews_rides.user,
        DATE_FORMAT(date_ridden, "%d %M %Y") AS Date_Event,
        DATE_FORMAT(review_date, "%d %M %Y") AS Review_Date,
        tpf_rides.name AS ride_name,
        rating,
        tpf_parks.name AS park_name,
        country
    FROM
        tpf_reviews_rides  
        INNER JOIN tpf_rides ON tpf_reviews_rides.ride_id = tpf_rides.ride_id
        INNER JOIN tpf_ratings_rides ON tpf_reviews_rides.rating_link = tpf_ratings_rides.rating_id  
        INNER JOIN tpf_parks ON tpf_reviews_rides.park_id = tpf_parks.park_id

    UNION

    SELECT
        'park' as type,
        review_id,
        review,
        tpf_reviews_parks.user,
        DATE_FORMAT(date_visited, "%d %M %Y") AS Date_Event,
        DATE_FORMAT(review_date, "%d %M %Y") AS Review_Date,
        NULL as ride_name,
        rating,
        tpf_parks.name AS park_name,
        country
    FROM
        tpf_reviews_parks  
        INNER JOIN tpf_ratings_parks ON tpf_reviews_parks.rating_link = tpf_ratings_parks.rating_id  
        INNER JOIN tpf_parks ON tpf_reviews_parks.park_id = tpf_parks.park_id
) AS reviews
ORDER BY
    review_date DESC,
    review_id DESC
LIMIT ' . $start_from . ', ' . $limit;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM