2011-11-06 46 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