背景:我正在做一个项目,我正在更新一个内部站点,该站点大约在 2006 年左右的某个时候组合在一起(可能更早,我不太清楚)。我正在将“打印报告”功能移至基于 Web 的平台,并远离允许从 Microsoft Access 创建和打印报告的 ODBC 驱动程序。
因为他们只需要每个报告中可用的特定信息(否则我会提取所有数据并让他们自己按所需列对其进行排序)我已经将查询转换为视图,php 查询视图,然后格式化表格数据。
这适用于我从三个表中提取数据并有两个连接的视图:
表:口音,猎人,妖精。加入只是为了输入猎人和小妖精的名字,以便显示它们而不是他们的 ID 号。
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 品牌的首字母缩写词。所以我从几个不同的表中提取:
- 口音,妖精,paintColors和品牌。
- 口音:paintColor_id
- paintColors:paintColor_id,brand_id
- 品牌:brand_id,缩写
我有这个用于查询:
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 的角度工作;我使用工作台并在 GUI 中正确返回结果。
然而,网页向我抛出了一些错误,这让我想知道这个查询是否写得尽可能好。php 与我用于上述查询的代码相同,我选择视图,拉取结果,然后循环遍历结果以创建表格数据行。
错误信息:
- mysql_fetch_assoc():提供的参数不是有效的 MySQL 结果资源
- mysql_fetch_result():提供的参数不是有效的 MySQL 结果资源
我的具体问题:因为它必须是导致问题的两个 LEFT OUTER JOINS,所以这两个连接(和 WHERE 子句)可以以不会导致错误的更好方式编写吗?
编辑添加:代码很棒。这完全是另外一回事!