簡體   English   中英

將兩個表中的列合並為一個結果,然后在SELECT查詢中使用

[英]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.BarcodeAltBCODE.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 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

如果我正確理解了該問題,則可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM