繁体   English   中英

如何根据第二秒中数据的存在从mySQL数据库的一个表中选择一条记录?

[英]How do I select a record from one table in a mySQL database, based on the existence of data in a second?

请原谅我的无知。 SQL无疑是我正在努力进行纠正的教育方面最大的“空白”之一,将于10月发布。 这是场景:

我在数据库中有两个表,需要从中访问某些数据。 一个是users ,另一个是conversation_log 基本结构概述如下:

用户:

  • ID(INT)
  • 名称(TXT)

conversation_log

  • userid(INT)//与用户ID相同的值-实际上是我要检查的此表中的唯一字段
  • 输入(TXT)
  • 回应(TXT)

(请注意,我仅列出与当前挑战相关(或可能与之相关)的字段的结构)

我想做的是从users表中返回一个名称列表,该名称列表在session_log表中至少有一条记录。 目前,我正在使用两个单独的SQL语句来执行此操作,其中一个检查session_log中的记录的调用被称为数百次(如果不是数千次),对于每个用户ID一次,只是为了查看该ID是否存在记录。

当前,这两个SQL语句如下:

从1个users中选择id (获取下一个查询的用户ID值列表)

conversation_log userid选择id ,其中userid = $ userId限制1; (检查现有记录)

现在,我在用户表中列出了4,000多个用户。 我相信您可以想象这种方法需要花费多长时间。 知道有一种更简单,更有效的方法来执行此操作,但是自学成才,这是我要学习的东西。 任何帮助将不胜感激。

您必须执行所谓的“加入”。 嗯,这是根据两个表的共同值将两个表的行连接在一起。

看看这是否对您有意义:

SELECT DISTINCT users.name
FROM users JOIN conversation_log ON users.id = converation_log.userid

现在,JOIN本身就是一个“内部联接”,这意味着它将仅返回两个表共有的行。 换句话说,如果特定的session_log.userid不存在,则不会为该用户ID返回行,用户或会话日志的任何部分。

另外,如果您有明确的问题,请+1 :)

编辑:我添加了一个“ DISTINCT”,这意味着要筛选出所有重复项。 如果用户出现在一个以上的session_log行中,并且您没有DISTINCT,则将多次获得该用户的名称。 这是因为JOIN执行笛卡尔积 ,或执行每个表中符合JOIN ON准则的行的所有可能组合。

像这样:

SELECT *
FROM users
WHERE EXISTS (
    SELECT *
    FROM conversation_log
    WHERE users.id = conversation_log.userid
)

用简单的英语:选择每一行users ,使得存在至少一个排conversation_log与匹配的userid

您需要阅读的是JOIN语法。

SELECT count(*), users.name 
FROM users  left join conversion_log  on users.id = conversation_log.userid
Group by users.name

如果您希望HAVING count(*)> 0,则可以在末尾添加

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM