从多个表中拉出,具有多个连接

时间:2013-04-26 12:40:19

标签: php mysql

背景:我正在开展一个项目,我正在更新一个内部网站,这个网站在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品牌的首字母缩写。所以我从几个不同的表中拉出来:

  • 口音,小妖精,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的角度出发;我使用workbench并在GUI中正确地返回结果。

然而,网页给我一些错误,这让我想知道这个查询是否写得很好。 php是我用于上述查询的相同代码,我选择视图,拉取结果,并循环结果以创建表格数据行。

错误讯息:

  1. mysql_fetch_assoc():提供的参数不是有效的MySQL结果 资源
  2. mysql_fetch_result():提供的参数不是有效的MySQL结果资源
  3. 我的具体问题:既然它必须是造成问题的两个LEFT OUTER JOINS,那么这两个连接(以及WHERE子句)是否可以用更好的方式编写,不会导致错误?

    编辑添加:代码很棒。完全是另一回事!

0 个答案:

没有答案