簡體   English   中英

如何:插入值在另一個表上的列中

[英]How To: Insert into column where the value is on another table

總結問題:

我想寫一個預訂代碼 我有一個小問題,我想在另一個名為house_info表中的booked表中插入一個值。

booked & house_info數據庫的詳細信息如下:

預定桌位

 ID_Booking | House_Name | House_ID | House_No | House_Qty | House_Price |
          1 | Rose House |        1 |     RH01 |         1 |             |
          2 | Rose House |        1 |     RH02 |         1 |             |

房屋信息表

 House_ID | HouseState_Name | House_Qty | House_Price |
        1 |     Garden City |         8 |        40000|
        2 | Electronic City |        10 |      1000000|

我想在插入House_Price上的值house_info表到House_Price柱上booked預訂表上的用戶每次輸入。

您已經嘗試過的背景:

我已經在booked桌子上使用觸發器嘗試過這個,如下所示:

在預訂表上觸發(插入前)

IF NEW.House_ID= '1' THEN SET
NEW.House_Price = 40000;
ELSEIF NEW.House_ID= '2' THEN SET
NEW.House_Price = 1000000;

但我意識到這不是動態的,因為當公司想要更改每個HouseState_Name的價格時,他需要從觸發器中更改它。 所以我認為我需要的是來自PHPquery ,它可以調用每個HouseState_Name的值並將其保存在一個array並在Book Query傳遞時將其放置或插入(我希望我的邏輯是正確的,如果它是,我很抱歉錯誤的)。

我已經嘗試過搜索要使用的query 但我不知道我將如何使用查詢。

一些代碼:

預訂.php

require 'Connection.php';

//Check Connection
if ($conn->connect_error){
    die("Connection Failed: ". $conn->connect_error);
}

//Check for Submit
if (filter_has_var(INPUT_POST, 'Submit')) {
    //Get Form Data
    $CustomerEmail= htmlspecialchars($_POST["Email"], ENT_QUOTES);
    $House_Name= htmlspecialchars($_POST["HouseName"], ENT_QUOTES);
    $House_ID = htmlspecialchars($_POST["HouseID "], ENT_QUOTES);
    $House_No = htmlspecialchars($_POST["HouseNo "], ENT_QUOTES);

    //Validate the data fields
    if (!empty($CustomerEmail) && !empty($House_Name)) {
        //Passed
        if (filter_var($CustomerEmail, FILTER_VALIDATE_EMAIL) === false) {
            //Failed
            $msg = 'Please use a valid email';
            header("location: ../GardenCity.php?error=PleaseUseValidEmail");
        } else {
            //Passed
            echo "Creating a Booking.<br>";
            //Inserting the Booking Data into Database
            $sql = "INSERT INTO `booked`(`ID_Booking`, `CustomerEmail`, `House_Name`, `House_ID`, `House_No`) 
            VALUES (NULL, '$CustomerEmail', '$House_Name', '$House_ID ', '$House_No', '', '')";
            if ($conn->query($sql) === TRUE) {
                header("location: ../GardenCity.php");
            } else {
                echo "Error: " . $sql . "<br><br>" . $conn->error;
            }
        }

    } else {
        header("location: ../GardenCity.php?error=EmptyFields");
    }

}

$conn -> close();

預期成績:

更新價格前

數據庫外觀

ID_Booking | House_Name | House_ID | House_No | House_Qty | House_Price | 1 | Rose House | 1 | RH01 | 1 | | 2 | Rose House | 1 | RH02 | 1 | | 3 | Rose House | 1 | RH03 | 1 | 40000|

House_ID | HouseState_Name | House_Qty | House_Price | 1 | Garden City | 7 | 40000| 2 | Electronic City | 10 | 1000000|

更新價格后

數據庫外觀

ID_Booking | House_Name | House_ID | House_No | House_Qty | House_Price | 1 | Rose House | 1 | RH01 | 1 | | 2 | Rose House | 1 | RH02 | 1 | | 3 | Rose House | 1 | RH03 | 1 | 40000| 4 | Rose House | 1 | RH04 | 1 | 200000|

House_ID | HouseState_Name | House_Qty | House_Price | 1 | Garden City | 6 | 200000| 2 | Electronic City | 10 | 1000000|

我希望這能得到很好的解釋。 如果有任何令人困惑的陳述或問題,請告訴我。 如果這個問題得到解答,我會非常感謝你們,因為我被困在這個問題上,我的大腦無法工作。

我認為這可以工作,基本上只使用子查詢來獲取價格,應該獲得與插入觸發器相同的結果,但不使用固定價格。

INSERT INTO `booked` (
   `ID_Booking`, 
   `CustomerEmail`,
   `House_Name`, 
   `House_ID`,
   `House_No`, 
   `House_Qty`, 
   `House_Price`
) VALUES (
    NULL, 
   '$CustomerEmail', 
   '$House_Name', 
   '$House_ID',
   '$House_No', 
   '1', 
   (SELECT House_Price FROM house_info WHERE House_ID = '$House_ID')
)

編輯:我將House_Qty設置為 1,根據您的需要進行更改:)

也許您可以直接在觸發器中使用相同的子查詢(尚未測試):

SET NEW.House_Price = 
   (SELECT House_Price FROM house_info WHERE House_ID = NEW.House_id);

假設您的House_ID是唯一的 :)

我希望或多或少會看到這樣的模式:

houses(house_id*,name)

house_prices(house_id*,price_start_date*,price)

bookings(booking_id*,customer_id,total)

booking_detail(booking_id*,house_id*,start_date,end_date)

* = (component of) PRIMARY KEY

經過一些思考,很明顯,您目前的擔憂會因這種設計而消失。

您可以使用INNER JOINs構造這樣一個UPDATE語句,其中一個在子查詢中作為booked表的self-JOIN ,放在現有的INSERT語句之后:

update house_info h join (
  select b1.House_Price, b2.House_ID
  from booked b1
  join ( select House_ID,max(ID_Booking) as ID_Booking 
                from booked
               group by House_ID
                ) b2
     on b1.House_ID = b2.House_ID and b1.ID_Booking = b2.ID_Booking   
) bb on bb.House_ID = h.House_ID
set h.House_Price = bb.House_Price;

但我應該承認你的表格設計不好,因為重復的列它們在每個中都包含相同的信息。

演示

Insert Into booked_table (ID_Booking, House_Name, House_Id, House_No, House_Qty, House_Price)
Select 1, House_Name, House_ID, 'RHXX', House_Qty, (SELECT House_Price FROM house_info WHERE House_ID = MM1.House_ID) From booked_table MM1
Where
NOT EXISTS(
  SELECT * 
  FROM booked_table MM2
  WHERE MM2.ID_Booking > MM1.ID_Booking
);

小提琴: https : //www.db-fiddle.com/f/7Bt3ZTQqbjs1jKzJe34qSF/0

我不包括 ID_Booking 和 House_No 的增量。 如果您想增加 House_Price,只需使用另一個查詢即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM