MySQL自我内部加入和搜索

时间:2013-06-01 21:09:45

标签: php mysql sql

我在一个看似简单的搜索脚本中遇到了一些问题。我有以下MySQL表结构:

id_product | name_product | has_choice | choice_id
2            Coca-Cola      1            0
3            Fanta          0            2//the id_product of Coca-Cola
4            Sprite         0            2//the id_product of Coca-Cola

在内连接(包括连接)后我想要实现的是:

id_product | name_product           | has_choice | choice_id
3            Coca-Cola of Fanta       0            2
4            Coca-Cola of Sprite      0            2

注意产品的ID是pre-veveious choice id。此外,主要产品(对于那些选择,已被省略)。而且has_choice列表示产品有/没有选择。 完成此操作后,我将简单搜索结果元素。 我已经在这个问题上苦苦挣扎了两天。有人能帮我解决这个问题吗?我将不胜感激。感谢。

3 个答案:

答案 0 :(得分:2)

此查询should do it

SELECT t1.id_product, 
       Concat(Concat(t2.name_product, ' of '), t1.name_product) AS 
       `name_product`, 
       t1.has_choice, 
       t1.choice_id 
FROM   tbl1 AS t1 
       JOIN tbl1 AS t2 
         ON t1.choice_id = t2.id_product; 

答案 1 :(得分:1)

如果我理解正确你可能意味着可口可乐的芬达反之亦然。

SELECT p.id_product, 
       CONCAT(p.name_product, ' of ', p1.name_product) name_product, 
       p.has_choice, 
       p.choice_id
  FROM products p JOIN products p1
    ON p.choice_id = p1.id_product

请注意,特定情况INNER JOIN消除了has_choice获取母产品选择产品的需要。

输出:

| ID_PRODUCT |        NAME_PRODUCT | HAS_CHOICE | CHOICE_ID |
-------------------------------------------------------------
|          3 |  Fanta of Coca-Cola |          0 |         2 |
|          4 | Sprite of Coca-Cola |          0 |         2 |

这是 SQLFiddle 演示。

UPDATE1 要获取所有产品的清单,他们是否是产品选择,您需要使用LEFT JOIN。要在产品名称中搜索父产品和选择,请在WHERE子句中使用适当的表别名。

SELECT p.id_product,
       CASE WHEN p1.id_product IS NULL THEN
           p.name_product
       ELSE
           CONCAT(p.name_product, ' of ', p1.name_product) 
       END name_product, 
       p.has_choice, 
       p.choice_id
  FROM products p LEFT JOIN products p1  -- use LEFT JOIN here
    ON p.choice_id = p1.id_product
 WHERE p.has_choice = 0                  -- filter out parent products
   AND (p.name_product  LIKE '%a%'     -- search in product name
        OR
        p1.name_product LIKE '%a%') -- search in product name of a parent product
该查询中的

CASE允许为不是选择的产品提供简单的产品名称。

输出:

| ID_PRODUCT |        NAME_PRODUCT | HAS_CHOICE | CHOICE_ID |
-------------------------------------------------------------
|          3 |  Fanta of Coca-Cola |          0 |         2 |
|          4 | Sprite of Coca-Cola |          0 |         2 |
|          5 |               Axion |          0 |         0 |

这是 SQLFiddle 演示。

答案 2 :(得分:0)

你必须自己加入桌子。

试试这个:

SELECT id, CONCAT(table.name_product, ' of ', table2.name_product), table.has_choice, table.choice_id
FROM table
JOIN table ON (table.id_product = table.choice_id) AS table2