![](/img/trans.png)
[英]Make a query to combine one result from two different tables with same / different columns
[英]Combine columns from two tables AS one result and THEN use in SELECT query
我從兩個不同的表( 產品和供應商代碼 -內部聯接)中有一個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”,我想從產品返回第2行。
更新
謝謝你們的回應。 我不確定自己是否足夠清楚。
一旦將Product.Barcode和AltBCODE.Alt_code連接在一起 ,它們就是我希望能夠在WHERE子句中使用的$ column。 所以:
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
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這樣的%2345%只能匹配1
首先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
如果我正確理解了該問題,則可以使用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
希望能有所幫助
去做:
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
您想離開聯接表以不濾除行並使用合並
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.