0

我在一个看似简单的搜索脚本中遇到了一些问题。我有以下 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 是之前的选择 id。也是主要产品(对于那些选择,已被省略)。此外,has_choice 列表示该产品有/没有选择。完成此操作后,我将在结果元素中进行简单搜索。我已经在这个问题上苦苦挣扎了两天。有人能帮我解决这个问题吗?我将不胜感激。谢谢。

4

3 回答 3

2

这个查询应该这样做

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; 
于 2013-06-01T21:34:58.527 回答
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演示。

于 2013-06-01T21:35:27.223 回答
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
于 2013-06-01T21:18:18.287 回答