简体   繁体   English

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

[英]combining two different queries into one merged foreach

I'll try and explain this best I can. 我会尽力解释这一点。 I have two queries pulling data from MySQL, one pulls data on park reviews, the other pulls data on ride reviews. 我有两个查询从MySQL获取数据,一个查询获取公园评论数据,另一个查询获取骑行评论数据。 Both queries are sorted by Review Date . 这两个查询均按“ Review Date排序。

What I want on the web page is one list of reviews sorted by Review Date so park reviews and ride reviews will be mixed together in the one list. 我要在网页上显示的是按Review Date排序的Review Date列表之一,因此公园评论和乘车评论将混合在一起。

Almost like two foreach loops running, one for each query but taking it in turns based on the date. 几乎就像运行两个foreach循环一样,每个查询一个,但是根据日期轮流进行。

These are the two queries: For Rides 这是两个查询:乘车

$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.'';

For Parks: 对于公园:

$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.'';

and this is how separately I display the results: For Rides: 这是我分别显示结果的方式:对于乘车:

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>');

}

To make it trickier this page is paginated. 为了更复杂,在此页面上分页。 Looking at it, because the two queries are so similar if there is a way to combine at query level it would be best and help keep the paginate code in tact. 来看一下,因为如果有一种方法可以在查询级别进行合并,则这两个查询是如此相似,因此这将是最好的方法,并且有助于使分页代码保持完整。 Anyone have any suggestions on how I can achieve this? 有人对我如何实现这一目标有任何建议吗?

Thanks 谢谢

You can use UNION to merge together two select statements. 您可以使用UNION将两个select语句合并在一起。

Note that if your tables are so similar, it may be better to merge them (not in the query, but the actual tables). 请注意,如果您的表是如此相似,则最好将它们合并(不是在查询中,而是在实际表中)。 I do not see any fields that are not completely the same in your tpf_reviews_rides compared to tpf_reviews_parks . tpf_reviews_rides相比,您在tpf_reviews_rides不到任何不完全相同的tpf_reviews_parks Add a column denoting the review type (ride or park) and you should be set. 添加一列表示评论类型(乘车或停车)的列,您将被设置。 It will simplify your queries and your processing logic. 它将简化您的查询和处理逻辑。

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