背景:我正在开展一个项目,我正在更新一个内部网站,这个网站在2006年左右的某个时间放在一起(可能更早,我无法说清楚)。我正在将“打印报告”功能移动到基于Web的平台,而不是允许从Microsoft Access创建和打印报告的ODBC驱动程序。
因为他们只想要每个报告中提供的特定信息(否则我会提取所有数据并让它们按照所需的列自行排序)我已将查询转换为视图,并且php查询视图,然后格式化表格数据。
这适用于我从三个表中提取数据并有两个连接的视图:
表:口音,猎人,妖精。联接只是为了提取猎人和小妖精的名字,以便显示而不是他们的身份证号码。
SELECT
CONCAT(LEFT(a.red_id,1),'-',RIGHT(a.red_id,5)) AS red
, a.orange
, a.yellow
, a.green
, a.blue
, DATE_FORMAT(a.color_begin, '%m/%d/%y') AS color_start
, DATE_FORMAT(a.color_end, '%m/%d/%y') AS color_end
, DATE_FORMAT(a.rainbow_begin, '%m/%d/%y') AS rainbow_start
, DATE_FORMAT(a.rainbow_end, '%m/%d/%y') AS rainbow_end
, SUBSTRING(l.lastname FROM 1 FOR 10) as leprechaun
, SUBSTRING(a.keywords FROM 1 FOR 25) as keyword
, CONCAT(h.firstname, ' ', h.lastname) AS treasureHunter
, a.indigo
, CONCAT(LEFT(a.color_rate * 100, 2), '%') as color_percent
, a.violet
FROM accents a
JOIN hunters h ON a.treasureHunter_id = h.hunter_id
JOIN leprechauns l ON a.leprechauns_id = l.leprechauns_id
WHERE rainbow_end >= sysdate() - INTERVAL 90 day
AND
LEFT(red_id, 1) ='5'
ORDER BY a.red_id ASC;
这样可以正常工作,结果会在屏幕上正确显示。
接下来,我从重音表中拉出来,但这一次,我需要获得用于任何给定记录的paintColor品牌的首字母缩写。所以我从几个不同的表中拉出来:
我有这个查询:
SELECT
CONCAT(LEFT(a.red_id,1),'-',RIGHT(a.red_id,5)) AS red
, DATE_FORMAT(a.rainbow_end, '%m/%d/%y') AS rainbow_end
, SUBSTRING(l.lastname FROM 1 FOR 10) as leprechaun
, SUBSTRING(a.keywords FROM 1 FOR 25) as keyword
, b.acronym
, a.pink
FROM accent a
JOIN leprechauns l ON a.leprechauns_id = l.leprechauns_id
LEFT OUTER JOIN paintColors p ON a.paintColor_id = p.paintColor_id
LEFT OUTER JOIN brands b ON b.brand_id = p.brand_id
WHERE a.paintColor_id = p.paintColor_id
AND a.active = '1'
AND rainbow_end >= SYSDATE() - INTERVAL 90 DAY
AND LEFT(a.red_id, 1) = '5'
ORDER BY b.acronym ASC;
此查询从MySQL的角度出发;我使用workbench并在GUI中正确地返回结果。
然而,网页给我一些错误,这让我想知道这个查询是否写得很好。 php是我用于上述查询的相同代码,我选择视图,拉取结果,并循环结果以创建表格数据行。
错误讯息:
我的具体问题:既然它必须是造成问题的两个LEFT OUTER JOINS,那么这两个连接(以及WHERE子句)是否可以用更好的方式编写,不会导致错误?
编辑添加:代码很棒。完全是另一回事!