从两个表中获取数据

时间:2018-10-23 09:36:29

标签: php mysql codeigniter

我有一个关于join的查询。基本上有两个表 product product_boost 。表 product_boost 具有product_id作为外键,它也在 product 表中。

我想使用在两个表中都可用的join获取数据,并且,如果不仅第一个表中的数据会出现。

我正在使用正确的外部联接,这是我的查询

SELECT * FROM `vefinder_product` 
RIGHT OUTER JOIN `vefinder_product_boost` ON `vefinder_product_boost`.`product_id`=`vefinder_product`.`product_id` 
WHERE `vefinder_product`.`status` = 1 
  AND `vefinder_product`.`post_type` != 5 
  AND `vefinder_product`.`country` IN('348') 
  AND `vefinder_product`.`product_stock` >0 
  AND `vefinder_product`.`product_in_stock` = 1 
  AND `vefinder_product_boost`.`target_age_from` >= 20 
  AND `vefinder_product_boost`.`target_age_to` <= 40  
ORDER BY `vefinder_product`.`is_boosted` DESC, 
         `vefinder_product`.`is_sponsered` DESC, 
         `vefinder_product`.`created_date` DESC LIMIT 21 

我怎么能得到想要的东西,因为这不起作用。我正在使用codeigniter php。

3 个答案:

答案 0 :(得分:1)

  • 如果要从第一个(最左侧)表获取所有数据,请改用Left join
  • 除第一个表(最左侧)以外的其他任何Where条件都应在ON中移到Left Join条件。否则,Where也会过滤掉不匹配的行(右侧表中的null)。

请尝试以下操作:

SELECT * 
FROM `vefinder_product` 
LEFT OUTER JOIN `vefinder_product_boost` 
  ON `vefinder_product_boost`.`product_id`=`vefinder_product`.`product_id` AND 
     `vefinder_product_boost`.`target_age_from` >= 20 AND 
     `vefinder_product_boost`.`target_age_to` <= 40 
WHERE `vefinder_product`.`status` = 1 AND 
      `vefinder_product`.`post_type` != 5 AND 
      `vefinder_product`.`country` IN('348') AND 
      `vefinder_product`.`product_stock` >0 AND 
      `vefinder_product`.`product_in_stock` = 1 
ORDER BY `vefinder_product`.`is_boosted` DESC, 
         `vefinder_product`.`is_sponsered` DESC, 
         `vefinder_product`.`created_date` DESC 
LIMIT 21 

答案 1 :(得分:0)

使用左连接并将条件放在ON线索中

SELECT * FROM `vefinder_product` 
left OUTER JOIN `vefinder_product_boost` ON `vefinder_product_boost`.`product_id`=`vefinder_product`.`product_id` 
  and `vefinder_product`.`status` = 1 
  AND `vefinder_product`.`post_type` != 5 
  AND `vefinder_product`.`country` IN('348') 
  AND `vefinder_product`.`product_stock` >0 
  AND `vefinder_product`.`product_in_stock` = 1 
  AND `vefinder_product_boost`.`target_age_from` >= 20 
  AND `vefinder_product_boost`.`target_age_to` <= 40  
ORDER BY `vefinder_product`.`is_boosted` DESC, 
         `vefinder_product`.`is_sponsered` DESC, 
         `vefinder_product`.`created_date` DESC LIMIT 21 

答案 2 :(得分:-1)

您可以使用第三方软件,例如SQLyog。 联接查询非常简单,只需使用UI构建查询并为表之间的字段分配关系即可。 在sqlyog中,您可以从多个表中获取数据,而不仅仅是两个表。 因为我当前正在使用该软件来节省时间。