我有一个聊天应用程序的这两个表格表
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的行时,查询有什么问题! :))
答案 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)
users
和chat_data
表应该是JOINED,以便获得唯一的元组作为结果。
由于无法加入users
和chat_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