2015-01-16 159 views
0

我需要一些帮助来加入下面的查询,因为我相信这是超级重的,while循环内其他while循环...一团糟,对吧?! :(Mysql复杂查询加入

这工作,但如果有人可以帮助加入到只有一个查询这样的:

$query_1 = mysql_query("SELECT * FROM booking_reservation WHERE reservation_confirmed = '1' AND (reservation_name LIKE '$data%' OR reservation_phone LIKE '$data%' OR reservation_email LIKE '$data%')"); 

    while ($row = mysql_fetch_array($query_1)) { 
     $calendar_id = $row['calendar_id']; 
     $query_2 = mysql_query("SELECT * FROM booking_calendars WHERE calendar_id = '$calendar_id'"); 
     $row_2 = mysql_fetch_array($query_2); 
     $slot_id = $query_1['slot_id']; 
     $query_3 = mysql_query("SELECT * FROM booking_slots WHERE slot_id = '$slot_id'"); 
     while ($row_3 = mysql_fetch_array($query_3)) { 
      echo '<tr><td>' . htmlentities($row2['slot_date']) . '</td><td>' . htmlentities($query_3['slot_time_from']) . '</td><td>' . htmlentities($query_1['reservation_name']) . '</td><td>' . htmlentities($query_3['calendar_title']) . '</td><td>' . htmlentities($query_1['reservation_phone']) . '</td><td>' . htmlentities($query_1['reservation_email']) . '</td></tr>'; 
     } 
    } 
+1

停止使用不推荐使用的'mysql_ *'函数,改为使用PDO/MySQLi。 – Raptor

+2

我认为这可能是题外话题,因为它属于http://codereview.stackexchange.com/ – Pred

+0

这个问题似乎是主题(不幸)。 – RandomSeed

回答

0

其中一个应该是你想要的,你用INNER JOIN如果你想获得该只存在预订在booking_calendars和booking_slots,或LEFT JOIN如果你希望所有的保留,无论他们是否在其他表中不存在

内连接:

SELECT * FROM booking_reservation br 
INNER JOIN booking_calendars bc ON br.calendar_id=bc.calendar_id 
INNER JOIN booking_slots bs ON br.slot_id=bs.slot_id 
WHERE br.reservation_confirmed = '1' 
AND (br.reservation_name LIKE '$data%' 
OR br.reservation_phone LIKE '$data%' 
OR br.reservation_email LIKE '$data%') 

LEFT JOIN:

SELECT * FROM booking_reservation br 
LEFT JOIN booking_calendars bc ON br.calendar_id=bc.calendar_id 
LEFT JOIN booking_slots bs ON br.slot_id=bs.slot_id 
WHERE br.reservation_confirmed = '1' 
AND (br.reservation_name LIKE '$data%' 
OR br.reservation_phone LIKE '$data%' 
OR br.reservation_email LIKE '$data%') 

1重要提示,我们不建议使用SELECT *,它是更好地告诉你的mysql从每个表中需要哪些列,或从表中你从选择。

注意:你应该听什么猛禽说,mysql_ *功能被取消,并将在以后的PHP版本中删除,你应该开始使用PDOmysqli

+0

谢谢你们!它正在工作:) –

0

这种尝试,我希望这个查询作品对你来说

select * from booking_reservation br 
join booking_calendars bc ON br.calendar_id=bc.calendar_id 
join booking_slots bs ON bc.slot_id=bs.slot_id 
where br.reservation_confirmed='1' 
AND br.(reservation_name LIKE '$data%' OR br.reservation_phone LIKE '$data%' OR br.reservation_email LIKE '$data%') 
+1

逗号分隔的连接在二十多年前被标准SQL中的显式连接取代。他们不应该再用了。 –

+0

@ Thorsten Kettner我希望你觉得快乐......其实在过去的查询中,我没有看到性能的差异......所以我去了查询 –

+0

我很高兴,谢谢你:-)这不是关于性能,但是;查询是等同的。这是关于可读性和错误倾向性(用逗号分隔的连接,例如,无法区分想要的和不想要的交叉连接)。 –