2015-11-26 3 views
0

У меня есть запрос на выборку из двух различных таблиц (продукта & Поставщика Кода - внутренняя соединена), где указанный столбец на% LIKE% мой поиск строки ,Объединить столбцы из двух таблиц AS один результата, а затем использовать в запросе на выборке

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 

Проблема у меня есть один из столбцов (штрих-) имеет альтернативы, которые хранятся в таблице третьего - AltBCode. Поэтому, если $ column = Barcode, это совпадение может быть в Product.Barcode. Или оно может быть в AltBCode.Alt_Barcode (оба они оба уникальны).

Я могу только предпочесть Мне нужно объединить эти два столбца сначала как один Столбец AllBarcodes скажите, а затем используйте это в моем выборе запроса?

Компоновка из таблиц, хранящих два штрих-кода является:

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» Я хочу вернуться Row 2 из продукта.

UPDATE

Спасибо за ответы, ребята. Я не уверен, что был достаточно ясен.

После Product.Barcode и AltBCODE.Alt_code соединены они являются $ Колонки я хочу, чтобы иметь возможность использовать в своем ИНЕКЕ. Итак:

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 даст мне строки:

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% будет только матч

+0

Какой штрих-код вы хотите вернуть? исходный штрих-код или альтернативный штрих-код? – Sean

+0

Штрих-код Alternatre вместе с соответствующей строкой Product_ID – Amused

+0

Здесь нет LIKE. Это просто простое соединение. – Strawberry

ответ

0

Firs t left joinProduct 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

+0

Получили ли вы ответ за это? –

0

Если я правильно понимаю проблему, вы можете использовать CASE КОГДА для этого.Сначала присоединитесь к таблице 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 

Надежда, что помогает

0

ли что:

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

Вот простой SQLFidle без supplier_code: DEMO

0

вы хотите налево присоединиться к таблице альт к не отфильтровывать ряды и использовать коалесценцию

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 
+0

coalesce не работает печально. Он возвращает только штрих-коды из одной таблицы (первый из них перечисляет в этом случае все Alt_Codes, но код product.bar никогда не получает списки). 'Настольный товар' 'ID | Штрих-код | Desc ' ' 2 | 1234 | Яблоки ' ' Табличные штрих-коды ' ' ID | PROD_ID | ALT_CODE ' ' 1 | 2 | 2345 ' ' 2 | 2 | 3456 ' ' 3 | 2 | 4567' Я хочу, чтобы запрос, чтобы дать мне ** 4 ** Ряды: PROD_ID -> 2, штрихкод -> 1234, DESC-> ЯБЛОКИ PROD_ID -> 2, ШТРИХ -> 2345, DESC-> ЯБЛОКИ PROD_ID -> 2, BARCODE -> 3456, DESC-> APPLES PROD_ID -> 2, BARCODE -> 4567, DESC-> APPLES – Amused