簡體   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