如何检查MySQL中同一行的多个值?

如何检查MySQL中同一行的多个值?,mysql,Mysql,在MySQL中,我有以下四个表: 引号 id | uid | tid | message | time idu | username id | uid | name 引用\u rnd id | message 用户 id | uid | tid | message | time idu | username id | uid | name 作者 id | uid | tid | message | time idu | username id | uid | name 我需要

在MySQL中,我有以下四个表:

引号

id | uid | tid | message | time
idu | username
id | uid | name
引用\u rnd

id | message
用户

id | uid | tid | message | time
idu | username
id | uid | name
作者

id | uid | tid | message | time
idu | username
id | uid | name
我需要填充
引号
表,因此这是我的过程:

BEGIN

INSERT INTO quotes
(message)
SELECT message
FROM quotes_rnd ORDER BY RAND() limit 1;

UPDATE quotes SET tid = (
SELECT id FROM authors WHERE id>10 ORDER BY rand() LIMIT 1)
WHERE tid = 0;

UPDATE quotes SET uid = (
SELECT idu FROM users WHERE idu BETWEEN 13 AND 63 ORDER BY rand() LIMIT 1)
WHERE uid = 0;

END
问题

UPDATE quotes SET uid = (
SELECT idu FROM users WHERE idu BETWEEN 13 AND 63 ORDER BY rand() LIMIT 1)
WHERE uid = 0;
在此查询行之前,已经设置了
tid
值,而不是
uid=0


只有当表中所有行的
uid.tid
与此处随机分配的最后一行的
quotes
不同时,如何设置uid

MySQL:#1093-不能在FROM子句中为更新指定目标表“upd”

不过,为了让大家知道这个问题,我将它们保存在这里。请向下滚动到“编辑”以查看我的第三个解决方案,该解决方案正在运行,并且已被接受:-)

您说您想与随机用户一起尝试一次,并在uid+tid重复的情况下保持uid=0。为此,您将使用带有联接的更新:

UPDATE quotes upd 
  CROSS JOIN (SELECT idu FROM users WHERE idu BETWEEN 13 AND 63 ORDER BY rand() LIMIT 1) u
SET upd.uid = u.iud
WHERE upd.uid = 0
AND NOT EXISTS
(
  select *
  from quotes q
  where q.tid = upd.tid
  and q.uid = u.uid
);
但是,如果希望尽可能长时间地查找非重复用户,则应使用相关子查询:

UPDATE quotes upd
SET uid = coalesce
(
  (
    SELECT idu 
    FROM users u
    WHERE idu BETWEEN 13 AND 63 
    AND NOT EXISTS
    (
      select *
      from quotes q
      where q.tid = upd.tid
      and q.uid = u.uid
    )
    ORDER BY rand() LIMIT 1
  ), 0
)
WHERE uid = 0;
区别在于:您将所有非重复用户都考虑在内。只要至少有一个,您将进行更新。而对于第一个update语句,您只需尝试一个随机用户,要么是非重复用户,然后您将进行更新,否则不会。

编辑:我还不精通MySQL,所以我不知道如何快速克服MySQL的限制。但是,如果您喜欢第二种方法背后的想法,那么您甚至可能希望尽可能长时间地获取tid/uid对,即当其他tid仍然有tid/uid对可用时,不要使用用完的tid进行更新。您可以在插入时执行以下操作:

INSERT INTO quotes (message, tid, uid)
SELECT q.message, a.id, coalesce(u.idu,0)
FROM quotes_rnd q
JOIN authors a ON a.id > 10 
LEFT JOIN users u ON u.idu BETWEEN 13 AND 63
  AND NOT EXISTS
  (
    select *
    from quotes q
    where q.tid = a.id
    and q.uid = u.idu
  )
ORDER BY (u.idu IS NULL), rand() LIMIT 1;
(这是一种交叉连接,目的是找到所有可能的对,因此在大型表上可能比较慢。)


SQL fiddle:。

我可能错了,但数据模型似乎有缺陷。
tid
是作者的ID,是吗?作者是一个用户,拥有
uid
。那么为什么在引号中有两列,
uid
tid
tid
是作者,与用户ID暗含关联。但是谁是
uid
?@ThorstenKettner嗨,是的
tid
是作者的ID,
uid
来自
users
表,检查最后一个查询。是的,但是这个用户是谁?我知道一个报价有一个作者,但在你的表中报价还有一个用户。那个人是谁?那个人和报价有什么关系?@ThorstenKettner好的,uSER是在我插入作者时注册到网站的用户。因此基本上,
id
是主键,
uid
是用户id,
tid
是作者id,
message
quotes\rnd
消息,
time
是时间戳。你的答案非常技术性。所以你插入作者。这些都有一个uid,所以每个作者都必须是注册用户,对吗?然后有人输入引号。每个引号都有一个作者(tid),但也有一个用户(uid).我一直在问的是:这个用户是谁?是插入引号的用户吗?至于消息:您存储消息两次,一次用引号,一次用引号?两个表中的一个不应该使用另一个表的ID来指向消息吗?我尝试了第二个选项,得到了错误消息:
MySQL:#1093-您无法在FROM子句中指定更新的目标表“upd”
我已编辑了我的答案。抱歉,我不知道如何快速解决此问题,现在没有太多时间。(当然可以将此作为单独的问题发布。)但我添加了另一个选项。谢谢,最后一个解决方案解决了我的问题…请编辑或删除第一个选项,它不起作用(与以前的问题相同)天哪,我很高兴至少第三个查询帮助了你:-)我编辑了我的答案,以表明前两个方法都不起作用。很抱歉发布了那些未经测试的更新语句;我不使用MySQL,所以我不知道这个#1093限制。