2011-11-06 52 views
1

我有3個表:結合了SELECT結果的變量爲INSERT語句

用戶 - UID(INT AUTO_INCREMENT),名(VARCHAR)

電影 - MID(IN AUTO_INCREMENT),標題( VARCHAR)

看了 - UID(INT),MID(INT)

我正在寫一個PHP函數,構造了一個查詢它增加了一個particul看電影的記錄一個人。下面是我想出迄今:

function set_watched($name, $movies){ 
    $sql = "SET @userid = (SELECT uID FROM users WHERE name = '$name' LIMIT 1); "; 
    $sql .= "INSERT INTO watched (uID, mID) VALUES ('"; 

    foreach ($movies as $index => $movie){ 

    } 

} 

我的問題: 有沒有辦法給@userid變量與SELECT mID FROM MOVIES WHERE title = $movie OR title = $movie [generated with foreach]的結果結合起來?

我不想爲每個電影標題生成單獨的SELECT語句。也許我甚至不需要使用@userid變量呢?

回答

2

嘗試這樣:

$sql = "INSERT INTO watched (uID, mID) 
    SELECT User.uID, Movies.mID 
    FROM (SELECT uID FROM Users WHERE Users.name = '$name' LIMIT 1) AS User, Movies  
    WHERE "; 

foreach ($movies as $index => $movie){ 
    $sql .= "Movies.title = '$movie' OR "; 
} 

$sql = substr($sql, 0, -4) . ";"; 
+0

這_almost_作品。我得到「每個派生表都必須有自己的別名」錯誤。我需要做的是找出在哪裏添加AS子句 – dovydasm

+0

在 – Karsten

+0

以上添加別名非常感謝!我用這個來代替substr:if($ index dovydasm

1

我更喜歡使用數組和內爆他們爲這種應用程序的。另外,我不會試圖強迫這兩件事情成爲一個查詢。我要麼:

  1. 邏輯修改功能參數接受uID作爲其輸入,而不是name
  2. 更改爲兩個查詢。

此外,PHP的mysql_query函數不支持多個查詢,所以如果您使用的是標準mysql函數,則不能通過一次調用mysql_query執行兩個查詢。

與情況#2運行時,可以使用這樣的(未經測試,當然):

$sql = 'SELECT uID FROM users WHERE name = "' . $name. '" LIMIT 1'; 
$result = mysql_query($sql); 
$row = mysql_fetch_row($result); 
mysql_free_result($result); 

$values_array = array(); 
foreach ($movies as $index => $movie) 
{ 
    $values_array[] = '("' . $row['uID'] . '", "' . $movie . '")'; 
} 

$sql = 'INSERT INTO watched (uID, mID) VALUES ' . implode(', ', $values_array); 
$result = mysql_query($sql); 
+0

我正在使用mysqli。我真的很喜歡把它整合成一個查詢,我知道這是可能的。 – dovydasm

+0

該解決方案在一個插入語句中結合了所有內容。它利用了MySQL允許在插入語句中指定多個值列表的事實。但是,它會運行單獨的選擇來獲取數據。這本身並不是問題,但這也意味着所有數據都從MySQL發送到PHP,然後再次發回到MySQL,而在Karsten的回答中,數據永遠不會離開MySQL數據庫。所以儘管知道這個語法是很好的,但它並不是迄今爲止最好的解決方案。 – GolezTrol