簡體   English   中英

將一行連接到另一個表中的多行

[英]Join one row to multiple rows in another table

我有一個實體表(讓我們稱它們為人)和屬性(一個人可以擁有任意數量的屬性)。 前任:

人們

Name  Age
--------
Jane  27
Joe   36
Jim   16

特性

Name   Property
-----------------
Jane   Smart
Jane   Funny
Jane   Good-looking
Joe    Smart
Joe    Workaholic
Jim    Funny
Jim    Young

我想寫一個有效的選擇,它會根據年齡選擇人並返回他們的全部或部分財產。

Ex: People older than 26
Name Properties
Jane Smart, Funny, Good-looking
Joe Smart, Workaholic

返回其中一個屬性和總屬性計數也是可以接受的。

查詢應該是高效的:people 表中有數百萬行,properties 表中有數十萬行(所以大多數人沒有屬性)。 一次選擇數百行。

有什么辦法嗎?

用:

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
LEFT JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

您需要 MySQL 函數 GROUP_CONCAT( 文檔)以返回 PROPERTIES.property 值的逗號分隔列表。

我使用 LEFT JOIN 而不是 JOIN 來包含在 PROPERTIES 表中沒有值的 PEOPLE 記錄 - 如果您只想要在 PROPERTIES 表中具有值的人員列表,請使用:

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
     JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

我意識到這是一個例子,但是當您考慮有多少“John Smith”時,使用名稱對於參照完整性來說是一個糟糕的選擇。 分配一個 user_id,作為每個用戶的唯一值,將是更好的選擇。

您可以使用INNER JOIN將兩個表鏈接在一起。 有關 JOIN 的更多信息

SELECT *
FROM People P
INNER JOIN Properties Pr
  ON Pr.Name = P.Name
WHERE P.Name = 'Joe' -- or a specific age, etc

但是,向此類表添加唯一主鍵並創建索引以提高速度通常要快得多。

假設表People有一個字段id
並且表Properties有一個字段peopleId將它們鏈接在一起

然后查詢將如下所示:

SELECT *
FROM People P
INNER JOIN Properties Pr
  ON Pr.id = P.peopleId
WHERE P.Name = 'Joe'
SELECT x.name,(select GROUP_CONCAT(y.Properties SEPARATOR ', ')
FROM PROPERTIES y 
WHERE y.name.=x.name ) as Properties FROM mst_People x 

嘗試這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM