情况:我有一个包含questionFK
,ordinal
和 testFK | questionFK | ordinal
2 14 1
2 15 2
2 16 3
_____________________________
NEW 2 17 4
列的联结表。
testFK = 2
我想使用questionFK = 17
和ordinal
向表中添加新行,但是,我希望根据表中已有的内容自动生成SQL
。由于最高序数为3,因此我希望$stmt = $db->prepare('
SET @QOrdinal = (SELECT MAX(ordinal) FROM junc_test_question WHERE testFK = ?);
INSERT
INTO junc_test_question
(junc_test_question.testFK, junc_test_question.questionFK, junc_test_question.ordinal)
VALUES (?, ?, @QOrdinal);
');
$stmt->bind_param('iii', $this->testID, $this->testID, $question_id);
//var_dump($stmt);
if($stmt->execute()) {
return true;
} else {
return false;
}
自动生成4.
我试过了:
ordinal
如果我对SQL
进行硬编码,这是有效的,但我似乎无法让Fatal error: Call to a member function bind_param() on a non-object in \classes\Test.php on line 91
自己做。{/ p>
非常感谢任何输入!
更新 我得到的错误
SQL
所以我假设{{1}}不正确。
答案 0 :(得分:3)
在OP最近的评论中,下面提出的解决方案并不恰当。
如果您使用MyISAM表类型并定义自动增量列为第二个的主键,则MyISAM automatically calculates按第一个字段分组的增量(请参阅链接文档中的MyISAM注释):< / p>
对于MyISAM表,您可以在辅助节点上指定AUTO_INCREMENT 多列索引中的列。在这种情况下,生成的值 对于AUTO_INCREMENT列,计算为 MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix。这是 当您想要将数据放入有序组时非常有用。
所以,你可以简单地按如下方式定义表格 - 尽管在实践中,我不确定我是否会存储这个序数:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(testFK INT NOT NULL
,ordinal INT NOT NULL AUTO_INCREMENT
,questionFK INT NOT NULL
,PRIMARY KEY(testFK,ordinal)
) ENGINE = MYISAM;
INSERT INTO my_table VALUES
(2,1,14),
(2,2,15),
(2,3,16);
INSERT INTO my_table (testFK,questionFK) VALUES
(2,17);
SELECT * FROM my_table;
+--------+---------+------------+
| testFK | ordinal | questionFK |
+--------+---------+------------+
| 2 | 1 | 14 |
| 2 | 2 | 15 |
| 2 | 3 | 16 |
| 2 | 4 | 17 |
+--------+---------+------------+
或者,你可以按照这些方式做一些事情(简化) - 但我从不认真提倡这个解决方案:
INSERT INTO my_table (testFK,questionFK,ordinal)
SELECT 2,18,MAX(ordinal+1) FROM my_table;
SELECT * FROM my_table;
+--------+---------+------------+
| testFK | ordinal | questionFK |
+--------+---------+------------+
| 2 | 1 | 14 |
| 2 | 2 | 15 |
| 2 | 3 | 16 |
| 2 | 4 | 17 |
| 2 | 5 | 18 |
+--------+---------+------------+
答案 1 :(得分:1)
试试这个:
INSERT INTO junc_test_question (testFK, questionFK, ordinal)
VALUES (2, 17, (select * from (select ordinal+1 from junc_test_question order by ordinal desc limit 1) as p) );
对于下一个序数查询同一个表的最大值,并为其添加1。
答案 2 :(得分:0)
INSERT INTO junc_test_question (testFK, questionFK, ordinal)
VALUES (?, ?, (
select MAX(ordinal)+1 from (select * from junc_test_question ) as rftable where testFK=?
) );
这是我的答案。