将两个表中的列组合为一个结果,然后在SELECT查询中使用

时间:2015-11-26 16:31:47

标签: mysql sql inner-join

我有两个不同的表(产品& 供应商代码 - 内部联合)的SELECT查询,其中指定的列是%LIKE%我的搜索字符串。

SELECT product.*, supplier_code.PART_NO AS PART_NO
FROM product INNER JOIN supplier_code ON 
product.PRODUCT_ID=supplier_code.PRODUCT_ID  
AND supplier_code.MAINSUPP = 1 
WHERE $column LIKE ? 
LIMIT 0, 25

我遇到的问题之一是其中一个列( Barcode ),其中包含存储在第三个​​表中的替代选项 - AltBCode 。因此,如果$ column = Barcode,那么匹配可能在Product.Barcode中,或者它可能在AltBCode.Alt_Barcode中(从不都是两者都是唯一的。)

我只能假设我需要首先将这两个列合并为一个 AllBarcodes 列,然后在我的Select查询中使用它?

两个条形码存储表的布局是:

Product Table
PRODUCT_ID | Barcode | Description | Price | Stock | Etc
1          |  12345  |   Apple     | 1.00  |    4  |  
2          |  45678  |   Orange    | 0.50  |    2  |
3          |  91583  |   Banana    | 2.00  |    0  |

AltBCode Table
Id | PRODUCT_ID | Alt_Barcode
1  |    2       |   4321

所以,如果我搜索" 4321"我想从Product返回第2行。

更新

感谢回复人员。我不确定我是否足够清楚。

一旦 Product.Barcode AltBCODE.Alt_code 加入,它们就是我希望能够在我的WHERE子句中使用的$列。所以:

SELECT product.*, supplier_code.PART_NO AS PART_NO
(Magically Select product.barcode and altbcode.altcode AS ALLBARCODES)
FROM product INNER JOIN supplier_code ON 
product.PRODUCT_ID=supplier_code.PRODUCT_ID  
AND supplier_code.MAINSUPP = 1 
WHERE ALLBARCODES LIKE %4321%
LIMIT 0, 25

所以简化如果:

Table Product
PROD_ID | Barcode | Desc
2       |  1234   | Apples

Table Alt Barcodes'
ID | PROD_ID | ALT_CODE
 1 |    2    | 2345'
 2 |    2    | 3456
 3 |    2    | 4567

WHERE PROD_ID = 2会给我 4 行:

PROD_ID -> 2, ALLBARCODE ->1234, DESC- > APPLES  
PROD_ID -> 2, ALLBARCODE ->2345, DESC- > APPLES  
PROD_ID -> 2, ALLBARCODE ->3456, DESC- > APPLES  
PROD_ID -> 2, ALLBARCODE ->4567, DESC- > APPLES  

但是ALLBARCODE LIKE%2345%只会匹配 1

4 个答案:

答案 0 :(得分:0)

首先left join Product TableAltBCode Table,因此您在同一张桌子上都有这两个代码。

SELECT PT.*, AT.Alt_Barcode
FROM `Product Table` PT
LEFT JOIN `AltBCode Table`  AT
       ON PT.PRODUCT_ID = AT.PRODUCT_ID 

您的最终查询应该是

我使用=代替LIKE

SELECT *,
       $column as MatchBarcode
FROM supplier S
JOIN `Product Table` PT
  ON S.PRODUCT_ID = PT.PRODUCT_ID 
LEFT JOIN `AltBCode Table`  AT
       ON PT.PRODUCT_ID = AT.PRODUCT_ID 
WHERE S.MAINSUPP = 1 
  AND ( 
          $column = AT.`Alt_Barcode`
       OR $column = PT.`Barcode`
      )   

首先我使用了

CASE 
    WHEN $column = AT.`Alt_Barcode` THEN AT.`Alt_Barcode`
    WHEN $column = PT.`Barcode` THEN PT.`Barcode`
END as MatchBarcode        

但这相当于$column as MatchBarcode

答案 1 :(得分:0)

如果我正确理解了这个问题,您可以使用CASE WHEN来执行此操作。首先加入AltBCode表,然后使用CASE语句根据条件过滤返回的列(可能需要更改条件)。类似的东西:

SELECT product.*, supplier_code.PART_NO AS PART_NO,
    case 
        when MyColumn = 'Barcode' then Product.Barcode
        when MyColumn = 'NotBarcode' then AltBCode.Alt_Barcode
    end as 'Barcode'
FROM product INNER JOIN supplier_code ON 
product.PRODUCT_ID=supplier_code.PRODUCT_ID  
AND supplier_code.MAINSUPP = 1 
inner join AltBCode on product.PRODUCT_ID = AltBCode.PRODUCT_ID
WHERE $column LIKE ?
LIMIT 0, 25

希望有所帮助

答案 2 :(得分:0)

那样做:

   SELECT
  a.* from product a, altbProduct b
  where a.product_id = b.product_id
and (a.barcode='4321' or b.altbarcode='4321');

这是一个没有supplier_code的简单SQLFidle:DEMO

答案 3 :(得分:0)

你想离开加入alt表而不过滤出行并使用coalesce

SELECT product.*, supplier_code.PART_NO AS PART_NO, coalesce(at. Alt_Barcode, supplier_code.barcode) as barcode
FROM product 
LEFT JOIN supplier_code ON product.PRODUCT_ID=supplier_code.PRODUCT_ID AND supplier_code.MAINSUPP = 1 
LEFT JOIN AltBCode ac ON product.PRODUCT_ID = ac.PRODUCT_ID
WHERE $column LIKE ? 
LIMIT 0, 25