我需要优化/实现MYSQL查询,并执行以下操作:
如果用户将项目标记为已显示,则需要存储,并创建SEEN / UNSEEN按钮,删除数据库中的对应行(如果已存在)(标记为已显示)或如果不存在则插入新行(没有标记)。
这意味着,我需要一个mysql查询来做到这一点:
DELETE FROM table WHERE userid = ? AND itemid = ?
或
INSERT INTO table (userid, itemid) VALUES (?,?)
取决于该行是否已存在。
我现在很容易使用php并在INSERT或DELETE之前检查SELECT的行数,但我想这样做所有优化的我可以。
答案 0 :(得分:0)
您可以使用第三列存储整数,广告使用该值作为“切换”,以通过UPSERT查询在看到/未看到之间切换。
类似的东西:
INSERT INTO table (userid, itemid, seen) VALUES (?,?,0) ON DUPLICATE KEY UPDATE seen = ((seen+1) MOD 2);
主键应由userid
和itemid
组成。 MOD
运算符可以轻松高效地实现您想要的已见/看不见的行为。
答案 1 :(得分:0)
如果存在或INSERT,您可以使用stored procedure来SELECT和DELETE。但更简单的是将数据留在那里并使用ON DUPLICATE KEY UPDATE更新看/看不见。
答案 2 :(得分:0)
if not currently_is_seen then mark_as_seen else mark_as_not_seen;
按钮算法应该是这样的:
if current_button_name_is_mark_seen then {
if not currently_is_seen then mark_as_seen;
} else {
if currently_is_seen then mark_as_not_seen;
}
(如果在某些特定情况下按钮被命名为“标记看见”按钮,它已被标记为已显示 - 按钮将不执行任何操作。如果在某些特定条件下按钮被命名为“标记看不见”,则它已经标记为看不见 - 按钮只会什么都不做。但是当标记为“标记看见”或“标记未看到”的按钮执行相反的操作时,它不正常。)
实施
if not currently_is_seen then mark_as_seen;
和
if currently_is_seen then mark_as_not_seen;
你可以使用
INSERT IGNORE INTO table (userid, itemid) VALUES (?,?)
和
DELETE FROM table WHERE userid = ? AND itemid = ?
(如果记录不存在,删除不会导致错误。)
Hovewer,如果你想实现
if not currently_is_seen then mark_as_seen else mark_as_not_seen;
逻辑非常,您可以使用stored routine(also here)。
答案 3 :(得分:-1)
INSERT INTO表(a,b,c)VALUES(1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c = VALUES(a)+ VALUES(b); 检查以下链接
http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm