簡體   English   中英

如何改進多次連接同一表的SQL

[英]How to improve the SQL joining same table multiple times

我正在維護使用MySQL和PHP的項目,我發現數據庫結構是這樣的。

table user

+----+-------+
| id | name  |
+----+-------+
|  1 | Tom   |
|  2 | John  |
|  3 | Peter |
|  4 | Mary  |
+----+-------+

table data

+--------+----------+----------+
| userid |   type   | content  |
+--------+----------+----------+
|      1 | gender   | male     |
|      1 | comment  | Hello    |
|      1 | phone    | 12345678 |
|      1 | username | tom      |
|    ... | ...      | ...      |
+--------+----------+----------+

我需要編寫SQL來獲取像這樣的數據

+-----+------+--------+----------+---------+----------+
| id  | name | gender |  phone   | comment | username |
+-----+------+--------+----------+---------+----------+
|   1 | Tom  | male   | 12345678 | Hello   | tom      |
| ... | ...  | ...    |      ... | ...     | ...      |
+-----+------+--------+----------+---------+----------+

所以SQL將是

SELECT user.id as "id",user.name as "name",d1.content as 'gender', d2....... FROM user
LEFT JOIN data d1 on d1.userid = user.id and d1.type = 'gender'....
LEFT JOIN...
LEFT JOIN...
LEFT JOIN...

它的工作原理,但我認為這太復雜了,很難maintenance.The性能當我添加更多類型的表還沒有good.Also data ,我需要增加更多的join到所有查詢。

如果SQL已經從表data獲取data ,它是否能夠過濾它並且不需要再次聯接它?

有什么想法可以使我的SQL查詢更簡單,更快嗎?

另一種方法是使用條件聚合:

SELECT u.id,
       MAX(CASE WHEN d.type = 'gender' THEN content END) AS gender,
       MAX(CASE WHEN d.type = 'comment' THEN content END) AS comment,
       MAX(CASE WHEN d.type = 'phone' THEN content END) AS phone,
       MAX(CASE WHEN d.type = 'username' THEN content END) AS username
FROM user u
LEFT JOIN data d ON d.userid = u.id
WHERE u.id = 1
GROUP BY u.id

輸出:

id  gender  comment phone       username
1   male    Hello   12345678    tom

dbfiddle上的演示

暫無
暫無

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

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