Сложность запроса 2 разных таблиц в базе данных с использованием SQL в PHP-документе - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть база данных в моем PHPMyAdmin, и она содержит 2 таблицы:

  1. tennisCourts
    courtID
    courtName
    bookingFee

  2. tenniscourts_Availability
    courtID
    court_dateBooked

Я пишу программу PHP с использованием репозитория PEAR и пытаюсь создать код, который позволит мне:

Возьмите выбранную пользователем дату бронирования суда и отобразите все поля из таблицы теннисных кортов только в том случае, если выбранная пользователем дата еще не занята другим пользователем. Я ввел фиктивные данные в таблицу tenniscourts_Availability.

SELECT and DISPLAY all fields 
from the tennisCourts table (courtID, courtName, bookingFee) 
WHERE court_dateBooked = $CHOSEN_BOOKING_DATE 
   *($_GET is used here to retrieve the booking date enetered by 
     the user in a seperate html document.)

Вот мой текущий код: -

$db_table_tennisCourts = "tennisCourts";
$court_ID = "courtID";
$court_Name = "courtName";
$booking_Fee = "bookingFee";


$db_table_tenniscourts_Availability = "tenniscourts_Availability";
$court_ID = "courtID";
$court_dateBooked = "court_dateBooked";

$CHOSEN_BOOKING_DATE =  $_GET['user_dateField']; //GET's input data from user form in my other html document.


$database->setFetchMode(MDB2_FETCHMODE_ORDERED);


$myQuery = "SELECT $court_ID , $court_dateBooked FROM $db_table_ WHERE $CHOSEN_BOOKING_DATE != $court_dateBooked";

$queryResult =& $db->query($myQuery);

if (PEAR::isError($queryResult)) {
    die($queryResult->getMessage());
}


while ($Col =& $queryResult->fetchRow()) {

echo $queryResult[0].' ';   //shows courtID 

    $queryResult[1];
    list($y,$m,$d)=explode('-',$queryResult[1]);
echo $d.'/'.$m.'/'.$y.'/<br/>';
}

?>

Я все еще новичок в PHP и SQL, так что прости меня, если я не прояснил себя. Я исследовал онлайн, и различные источники говорят, что используют SQL UNION ИЛИ JOIN? Может ли кто-нибудь объяснить мне, как их можно использовать в контексте моего сценария? Я действительно ценю любую помощь. Спасибо за проверку моего вопроса.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Измените ваш запрос на:

$myQuery = "
    SELECT DISTINCT
        c.courtID,
        c.courtName,
        c.bookingFee
    FROM
        tennisCourts c
        INNER JOIN tenniscourts_Availability a ON c.courtID = a.courtID
    WHERE
        a.court_dateBooked = '". mysql_real_escape_string($CHOSEN_BOOKING_DATE) ."'
";

Это позволит получить информацию о суде для всех судов, которые были забронированы на указанную дату. Если вы хотите получить информацию о суде для всех судов, которые не забронированы на указанную дату, используйте этот запрос:

$myQuery = "
    SELECT
        courtID,
        courtName,
        bookingFee
    FROM
        tennisCourts
    WHERE
        courtID NOT IN (SELECT courtID FROM tenniscourts_Availability WHERE court_dateBooked = '". mysql_real_escape_string($CHOSEN_BOOKING_DATE) ."'
";

Несколько замечаний по поводу вашего кода:

  1. Переменная PHP, которую вы используете для имени таблицы ($db_table_), по-видимому, не определена.
  2. Не уверен, если у вас есть особая причина для этого, но из кода, который вы разместили, я не вижу необходимости хранить имена столбцов в переменных PHP. Это просто запутывает вещи в вашем примере.
  3. Убедитесь, что вы дезинфицируете любой пользовательский ввод. Использование ввода непосредственно из $_GET уязвимо для SQL-инъекции .
0 голосов
/ 02 апреля 2012

Предполагая, что вещи добавляются в таблицу доступности только после того, как она была забронирована, я думаю, это то, что вы хотите.

SELECT c.courtID, c.courtName, c.bookingFee, a.court_dateBooked FROM tennisCourts c 
LEFT JOIN tenniscourt_Avaliability a ON c.courtID=a.courtID
WHERE b.court_dateBooked=$CHOSEN_BOOKING_DATE

затем вы можете отфильтровать, какие из них уже были забронированы, проверив, является ли параметр court_dateBooked нулевым или нет.

Подробнее о левом соединении смотрите следующее: В чем разница между "INNER JOIN" и "OUTER JOIN"?

...