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