mysql表问题?

时间:2011-02-19 12:37:50

标签: mysql

我有一个聊天应用程序的这两个表格表

users{user_id,username,pictures}
chat_data(con_id, chat_text}

我使用了这个SQL查询

SELECT c.chat_text, u.username
FROM chat_data c, users u
WHERE c.con_id =1

但它给我重复的结果,当我知道他们只有con_id = 1的行时,查询有什么问题! :))

5 个答案:

答案 0 :(得分:2)

您需要“加入”表格以避免重复。例如

SELECT c.chat_text, u.username
FROM chat_data c, users u
WHERE c.con_id =1
  and u.id = c.user_id

您可以阅读一些关于relational algebra的信息,这是关系数据库背后的理论。

答案 1 :(得分:1)

userschat_data表应该是JOINED,以便获得唯一的元组作为结果。 由于无法加入userschat_data,因此您只需获得两个表中的笛卡尔积

  

笛卡儿产品

     

如果连接查询中的两个表没有   加入条件,然后是Oracle数据库   返回他们的笛卡尔积。   Oracle组合了一个表的每一行   与另一行的每一行。一个   笛卡尔积总是产生   许多行,很少有用。对于   例如,两个笛卡尔积   表格,每行有100行,有10,000个   行。始终包含连接条件   除非你特别需要一个   笛卡尔积。如果查询加入   三个或更多表,你没有   为a指定连接条件   特定对,然后优化器可以   选择避免的连接顺序   产生中间笛卡尔   产品

参考:http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/queries006.htm

答案 2 :(得分:0)

使用这样的查询,您将在结果中获得与表用户中的行一样多的行。

答案 3 :(得分:0)

这是因为SQL正在进行的连接类型。是否为每个用户返回一行?这是我期望它正在做的事情,即如果你有2个用户John和Jack那么你是否会为这两个用户返回一行?

您是否只是想获取与对话中涉及的用户相关的数据?如果需要,您需要在两个表之间建立一些链接,例如引用用户的chat_data表中的外键引用。

答案 4 :(得分:0)

如前所述,您错过了两个表之间的链接。如果您尝试检索与特定聊天关联的用户,则需要在chat_data中添加引用user.user_id的外键引用。但是,如果您尝试让多个用户与聊天相关联,则需要添加新表。你的新表看起来像这样:

用户{USER_ID,用户名,图片}
chat_data(con_id,chat_text}
user_chat(user_id,con_id)//通过添加此新表,您可以在每次聊天时拥有多个用户

查询看起来像

SELECT u.username,c.chat_text
来自用户u,chat_data c,user_chat uc
在哪里u.id = uc.id
AND c.con_id = uc.con_id