问题描述
目标是更改此 URL...
app.com/journals/3/items
进入
app.com/journals/aWNtFJXeYuvyhyJpqAjW/items
...我想知道这是否是最佳方法,即加入 id,按 uid 搜索。
SELECT
ji.*,j.uid journalUid
FROM journalItems ji
LEFT JOIN journal j ON j.id = ji.journalId
WHERE
j.uid = 'aWNtFJXeYuvyhyJpqAjW'
journal
+----+----------------------+--------+
| id | uid VARCHAR(20) | name |
+----+----------------------+--------+
| 1 | cerGJ8cMKMK2njBtgsMy | foo |
| 2 | aWNtFJXeYuvyhyJpqAjW | bar | <------- journal
| 3 | 7zwACt4fHkEchSjeeW7j | baz |
+----+----------------------+--------+
journalItems
+----+----------------------+--------+-----------+
| id | uid VARCHAR(20) | name | journalId |
+----+----------------------+--------+-----------+
| 1 | ncv3VTlOMls6RPejJsjq | a | 1 |
| 2 | NPz9CKEk7w14fKqIkCI2 | b | 1 |
| 3 | jghhnU29IKoOoG4smM4W | c | 1 |
| 4 | YE1nFNzjnusuyZeMNFWF | d | 2 | <------- item
| 5 | 5N15UTgDgRjRKwt3yUCC | e | 2 | <------- item
| 6 | 0eTBq3Ptzjbw32LkAQ0j | f | 3 |
+----+----------------------+--------+-----------+
这是 UID 生成器:
function generateUid() {
let length = 20;
let uid = "";
let characters = "0123456789ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for (let i = 0; i < length; i++) {
uid += characters[Math.floor(Math.random() * characters.length)];
}
return uid;
}
解决方法
您的 where
子句正在撤消 left join
,因此您不妨使用常规的 join
:
SELECT ji.*,j.uid as journalUid
FROM journalItems ji JOIN
journal j
ON j.id = ji.journalId
WHERE j.uid = 'aWNtFJXeYuvyhyJpqAjW';
为了性能,您需要在 journalItems(journalId)
和 journal(uid,id)
上建立索引。
否则,您的查询没有问题,尽管您希望在只选择其中之一时将 j.uid
放入结果集中似乎很奇怪。