请尝试以下查询:
select
c.LOG_ID, c.CALL_TIME, c.PHONENUMBER, p.CUST_NAME
from
tbl_calllog c
left join
tbl_phonebook p
on
c.PHONENUMBER in (p.PHONE1, p.PHONE2, p.PHONE3, p.PHONE4);
我担心当前查询不是最好的性能,因为 mysql 必须检查所有电话列中的条件。
设置一个新表以将电话号码映射到用户,如下所示:
create table tbl_phonebook (
`PB_ID` int(11) NOT NULL,
`CUST_NAME` varchar(11) DEFAULT NULL,
`PHONE` int(11) DEFAULT NULL,
PRIMARY KEY (`PB_ID`),
index idx_p1 (PHONE)
) ENGINE=InnoDB;
insert into tbl_phonebook2 (CUST_NAME, PHONE)
VALUES ('Richard', 11111),
('Richard', 12222),
('Richard', 13333),
('Richard', 14444),
('Maria', 21111),
('Maria', 22222),
('Maria', 23333),
('Maria', 24444),
('Robert', 31111),
('Robert', 32222),
('Robert', 33333),
('Robert', 34444);
查询将是:
select
c.LOG_ID, c.CALL_TIME, c.PHONENUMBER, p.CUST_NAME
from
tbl_calllog c
left join
tbl_phonebook2 p
on c.PHONENUMBER = p.PHONE;
结果和执行计划如下:
mysql> select
-> c.LOG_ID, c.CALL_TIME, c.PHONENUMBER, p.CUST_NAME
-> from
-> tbl_calllog c
-> left join
-> tbl_phonebook2 p
-> on c.PHONENUMBER = p.PHONE;
+--------+------------+-------------+-----------+
| LOG_ID | CALL_TIME | PHONENUMBER | CUST_NAME |
+--------+------------+-------------+-----------+
| 1 | 2020-06-01 | 22222 | Maria |
| 2 | 2020-06-01 | 55555 | NULL |
| 3 | 2020-06-01 | 13333 | Richard |
+--------+------------+-------------+-----------+
3 rows in set (0.00 sec)
mysql> explain select
-> c.LOG_ID, c.CALL_TIME, c.PHONENUMBER, p.CUST_NAME
-> from
-> tbl_calllog c
-> left join
-> tbl_phonebook2 p
-> on c.PHONENUMBER = p.PHONE;
+----+-------------+-------+------------+------+---------------+--------+---------+--------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+--------+---------+--------------------+------+----------+-------+
| 1 | SIMPLE | c | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | NULL |
| 1 | SIMPLE | p | NULL | ref | idx_p1 | idx_p1 | 5 | test.c.PHONENUMBER | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+--------+---------+--------------------+------+----------+-------+
2 rows in set, 1 warning (0.00 sec)