Mysql在我的优化查询中留下了外部连接
我有两个数据库表名,分别为tablestr table和restbookingtable: 表TR: str_id是主键 再预订: bookingsection_id是外键 在预订表中,我使用逗号分隔存储str_id多个值,我的查询是Mysql在我的优化查询中留下了外部连接,mysql,sql,Mysql,Sql,我有两个数据库表名,分别为tablestr table和restbookingtable: 表TR: str_id是主键 再预订: bookingsection_id是外键 在预订表中,我使用逗号分隔存储str_id多个值,我的查询是 SELECT `str_id` FROM (`rest_tablestr`) WHERE str_id NOT IN ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.bookingsection_id, ",", n.n),
SELECT `str_id` FROM (`rest_tablestr`) WHERE str_id NOT IN (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.bookingsection_id, ",", n.n), ",", -1) value FROM rest_restaurantbooking t
CROSS JOIN (
SELECT a.N + b.N * 10 + 1 n FROM (
SELECT 0 AS N
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) a , (
SELECT 0 AS N
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL SELECT 9)
b ORDER BY n ) n
WHERE n.n <= 1 + (LENGTH(t.bookingsection_id) -
LENGTH(REPLACE(t.bookingsection_id, ",", ""))) AND
t.res_id = 21 AND
t.booking_status not in ("cancelled","departed","noshow") AND
((t.bookingstart_time <= "2015-06-12 19:45:00" AND t.bookingend_time >= "2015-06-12 22:15:00") OR
(t.bookingend_time >= "2015-06-12 19:45:00" AND t.bookingend_time <= "2015-06-12 22:15:00") OR
(t.bookingstart_time >= "2015-06-12 19:45:00" AND t.bookingstart_time <= "2015-06-12 22:15:00") OR
(t.bookingstart_time >= "2015-06-12 19:45:00" AND t.bookingend_time <= "2015-06-12 22:15:00")) ) AND
`res_id` = '21' AND
`area_id` = '28' AND
`wait_table` = 'no' AND
`availability` = 'yes';
结果集:
任何机构可以帮助我重写查询与左外连接或可以优化查询 您的外键是CSV?我不这么认为!请参阅规范化。@外键名称为bookingsection_id。但是我正在bookingsection_id中保存str_id值。请修复数据结构以使用单独的连接表,这是在关系数据库中存储数字列表的正确方法。此外,如果语言规则阻止您将列声明为外键,则不要将其称为外键。