2015-08-27 44 views
0

我有2個表,其中一個包含主要信息,第二個表包含相同的字段加上附加信息。第二個表格會有查詢時應覆蓋第一個表格的數據。領域更大,我只是縮短了他們在這裏展示。MySQL - 類似的標題 - 多表

第一表(產品):

+----+--------------+--------------+---------------+--------------------------+ 
| id | manufacturer | product_name | product_title |  product_description | 
+----+--------------+--------------+---------------+--------------------------+ 
| 1 |  testingA |  productA | productTitleA | main product description | 
| 2 |  testingA |  productB | productTitleB | main product description | 
| 3 |  testingA |  productC | productTitleC | main product description | 
+----+--------------+--------------+---------------+--------------------------+ 

第二表(products_secondary)

+----+------------+--------------+--------------+---------------+----------------------+---------+ 
| id | product_id | manufacturer | product_name | product_title | product_description | context | 
+----+------------+--------------+--------------+---------------+----------------------+---------+ 
| 1 |   1 |  (null) |  (null) |  (null) | new description here | test | 
+----+------------+--------------+--------------+---------------+----------------------+---------+ 

我的目標是從那裏context = text

預期結果的第二表中選擇的值:

+----+--------------+--------------+---------------+--------------------------+ 
| id | manufacturer | product_name | product_title |  product_description | 
+----+--------------+--------------+---------------+--------------------------+ 
| 1 |  testingA |  productA | productTitleA | new description here  | 
| 2 |  testingA |  productB | productTitleB | main product description | 
| 3 |  testingA |  productC | productTitleC | main product description | 
+----+--------------+--------------+---------------+--------------------------+ 

我知道作品的查詢如下:

SELECT IFNULL(`products_secondary`.`product_description` , `products`.`product_description`) AS `product_description` 
FROM `products` 
LEFT JOIN `products_secondary` ON `products_secondary`.`product_id` = `products`.`id` AND `products_secondary`.`context` = 'test'

我敢肯定有一個更簡單的方法來做到這一點不必提供IFNULL()的每個字段。這裏是一個SQL小提琴:http://sqlfiddle.com/#!9/6985b/1

謝謝。

+0

那是一個可怕的數據庫設計。爲什麼表2中的表1中的所有列無論如何,但將它們全部設置爲NULL使得更不用說 – RiggsFolly

+0

@RiggsFolly它看起來像第一個表是默認值,第二個表覆蓋了默認值。使用它的更常見的應用程序是翻譯表,當沒有翻譯時使用默認表。 – Barmar

+1

我認爲沒有比大量'IFNULL'測試更簡單的方法。抱歉。 – Barmar

回答

1

使用此查詢

SELECT a.id, a.manufacturer, a.product_name, a.product_title, IF(b.context IS NOT NULL, b.product_description, a.product_description) as product_description 
FROM 
    products a 
    LEFT OUTER JOIN products_secondary b ON a.id=b.product_id 
+0

它可以在這個特定的例子中工作,但是請注意這是一個默認表的例子,也就是說,如果主表中的某個字段沒有值,則從默認值中取出。不幸的是,對於一般情況來說,正確的方法是ifnulls。 – AdrianBR