![](/img/trans.png)
[英]How do I select record from mysql database based on the longest 'string' in one filed when grouping?
[英]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
。 基本结构概述如下:
用户:
conversation_log
(请注意,我仅列出与当前挑战相关(或可能与之相关)的字段的结构)
我想做的是从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.