在主键 (INT) 上加入,WHERE 通过字母数字 UID (VARCHAR) ......它是最佳的吗?

问题描述

目标是更改此 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 放入结果集中似乎很奇怪。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...