2016-10-25 3 views
1

У нас есть две таблицы,MySQL Left Присоединяйтесь - не пустой или первая строка

PRODUCT_INDEX:

+----------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+----------------+---------------+------+-----+---------+-------+ 
| PRODUCT_NUMBER | varchar(25) | NO | PRI |   |  | 
| VENDOR_NUMBER | varchar(10) | NO | PRI |   |  | 
| VENDOR_PRODUCT | varchar(25) | YES | MUL |   |  | 
+----------------+---------------+------+-----+---------+-------+ 

ПРОДУКЦИИ:

+------------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+------------------+---------------+------+-----+---------+-------+ 
| PRODUCT_NUMBER | varchar(25) | NO | PRI |   |  | 
| DESCRIPTION_ENG | varchar(500) | YES | MUL |   |  | 
| STATUS   | varchar(1) | YES |  |   |  | 
+------------------+---------------+------+-----+---------+-------+ 

, если мы выполним этот запрос, один PRODUCT_INDEX:

SELECT * FROM PRODUCT_INDEX WHERE PRODUCT_NUMBER = '900338' 

Мы получаем 3 результата в этом заказ.

+----------------+---------------+----------------+ 
| PRODUCT_NUMBER | VENDOR_NUMBER | VENDOR_PRODUCT | 
+----------------+---------------+----------------+ 
| 900338   | F00045  |    | 
| 900338   | F00509  |    | 
| 900338   | F01041  | CSR6719-2  | 
+----------------+---------------+----------------+ 

Теперь мне нужно сделать запрос выбирающий весь продукт из таблицы ПРОДУКТА и РЕГИСТРИРУЙТЕСЬтолько один ряд из таблицы PRODUCT_INDEX. Если поле VENDOR_PRODUCT не пусто для одной строки, мы хотели бы перенести эту строку. Если вся строка содержит поле VENDOR_PRODUCT, мы хотели бы взять первую строку, и если вся строка не содержит поля VENDOR_PRODUCT, мы бы хотели взять первую строку.

Пока я традиционный левый присоединиться запрос (для этого примера я выбрать только один продукт, но мой запрос для всего изделия в таблице PRODUCT):

SELECT 
    P.PRODUCT_NUMBER, 
    P.DESCRIPTION_ENG, 
    P.STATUS, 
    PCI.VENDOR_NUMBER, 
    PCI.VENDOR_PRODUCT 
FROM 
    PRODUCT P 
LEFT JOIN 
    PROD_CROSS_INDEX PCI 
ON 
    PCI.PRODUCT_NUMBER = P.PRODUCT_NUMBER 
WHERE 
    P.PRODUCT_NUMBER = '900338'; 

Этот запрос возврата 3 строки, потому что у них есть 3 строки соответствие в PRODUCT_INDEX.

Как я могу выполнить свой запрос?

EDIT 2:

Вот мой полный запрос прямо сейчас:

SELECT 
    P.*, 
    IP.master AS MASTER_PACK, 
    IP.inner AS INNER_PACK, 
    PO.INFO1, 
    PO.INFO2, 
    PO.INFO3, 
    PO.INFO4, 
    PO.INFO5, 
    PO.INFO6, 
    PO.INFO7, 
    PO.INFO8, 
    PO.INFO9, 
    PO.INFO10, 
    PO.INFO11, 
    PO.INFO12, 
    PO.MEMO_ENG1, 
    PO.MEMO_FR1, 
    PO.FLAGS1, 
    PO.MEMO_ENG2, 
    PO.MEMO_FR2, 
    PO.FLAGS2, 
    PO.MEMO_ENG3, 
    PO.MEMO_FR3, 
    PO.FLAGS3, 
    PO.PICTURE, 
    PP.PRICE_1, 
    PP.PRICE_2, 
    PP.PRICE_3, 
    PP.PRICE_4, 
    PP.PRICE_5, 
    PP.PRICE_6, 
    MAX(IFNULL(PCI.VENDOR_PRODUCT, 0)) AS VENDOR_PRODUCT 
FROM 
    PRODUCT P 
LEFT JOIN 
    PRODUCT_OTHER PO 
ON 
    PO.PRODUCT_NUMBER = P.PRODUCT_NUMBER 
LEFT JOIN 
    PRODUCT_PRICES PP 
ON 
    PP.PRODUCT_NUMBER = P.PRODUCT_NUMBER 
LEFT JOIN 
    addison_intranet.ae_produit IP 
ON 
    IP.sku = P.PRODUCT_NUMBER 
LEFT JOIN 
    PROD_CROSS_INDEX PCI 
ON 
    PCI.PRODUCT_NUMBER = P.PRODUCT_NUMBER 
WHERE 
    P.STATUS != 'D' AND P.MASTER = '' AND P.PRODUCT_NUMBER NOT LIKE '%ECH%' AND P.PRODUCT_NUMBER NOT LIKE '%CARTE%' AND P.PRODUCT_NUMBER NOT LIKE '%ZZZ%' AND P.UNIT != 'KIT' 
GROUP BY 
    P.PRODUCT_NUMBER 
ORDER BY 
    P.PRODUCT_NUMBER 
+0

Этот вид задачи (или, по меньшей мере, часть этой проблемы) часто является симптомом плохого дизайна. Каждый раз, когда вы перечисляете имена столбцов, сигнальные колокола должны начинать звонить. – Strawberry

+0

Наверное, но мы не разработчик базы данных этой системы, и наша цель состоит только в том, чтобы извлекать данные из этой базы данных для импорта в нашу новую систему. Я сохраню этот запрос, возможно, мы потеряем некоторые данные PRODUCT_VENDOR, что не очень важно. –

ответ

1

Вы можете использовать функцию агрегации

SELECT 
    P.PRODUCT_NUMBER, 
    P.DESCRIPTION_ENG, 
    P.STATUS, 
    max(ifnull(PCI.VENDOR_NUMBER, 0)), 
    max(ifnull(PCI.VENDOR_PRODUCT, 0) 
    FROM 
    PRODUCT P 
    LEFT JOIN 
    PROD_CROSS_INDEX PCI 
    ON 
    PCI.PRODUCT_NUMBER = P.PRODUCT_NUMBER 
    GROUP BY P.PRODUCT_NUMBER, P.DESCRIPTION_ENG, P.STATUS 
    ORDER BY PCI.VENDOR_PRODUCT desc limit 1; 
+0

Да, если я выбираю только один prodcut из таблицы PRODUCT. –

+0

Но мы выбираем весь продукт из таблицы продуктов looke на мое редактирование –

+0

Я изменил ответ, используя функцию агрегации и группу по .. надеюсь, полезно – scaisEdge

Смежные вопросы