2013-08-19 80 views
0

我会尽我所能地尝试和解释这一点。我有两个查询从MySQL拉取数据,一个查询关于公园评论的数据,另一个查询关于乘车评论的数据。这两个查询按Review Date排序。将两个不同的查询合并成一个合并的foreach

我在网页上想要的是按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>'); 

} 

为了让它更棘手,此页面进行分页。看着它,因为如果有一种方法可以在查询级别进行组合,那么这两个查询非常相似,这将是最好的,并有助于保持分页代码的完整性。任何人有什么建议我如何能够实现这一目标?

感谢

回答

0

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

请注意,如果您的表格如此相似,则最好将它们合并(不是在查询中,而是在实际表格中)。我没有看到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; 
+0

我想在阅读你的答案后再仔细观察它,我认为你的权利,我将合并这两张表。谢谢 – user2574794