我有两个不同的表(产品& 供应商代码 - 内部联合)的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
答案 0 :(得分:0)
首先left join
Product Table
和AltBCode 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