1

我的逻辑是我有两个表,表 A 和表 B,对吗?

information 是表 A 到表 B 的名称,表示将要查询的值

我举个例子

结构表A

id | title
------------------------------------------------------
1  | Iphone 5
2  | Galaxy S4

结构表 B

id | id_table_A| value|
-------------------------
1  | 1;2 | TV     |
2  | 1;2 | led    |
3  | 2   | samsung|
4  | 1   | apple  |
5  | 1   | android|
6  | 1   | iOS    |
7  | 1   | 4GB    |
8  | 1   | 64GB   |

上面没有问题,如果我对表B的值进行查询,它会正常显示,但问题是我需要存储其他标识(id_table_A)我想用逗号分隔它。

脚本应显示表 B 中值最正确的表的标题

这是它应该如何工作的示例

输入的值:

1º - 4GB
2º - LED
3º - 机器人
4º - 电视

那么它应该显示第一个Galaxy S4然后显示iphone来的时候结果应该显示与表A关联的值更多的顺序也注意到我使用了,来分隔id?

4

1 回答 1

2

请标准化您的数据。从长远来看,它会让您正常查询和维护数据,这将带来巨大的回报。

建议的架构可能如下所示

CREATE TABLE products
(
  `id` int, 
  `title` varchar(32)
);
CREATE TABLE tags
(
  `id` int, 
  `value` varchar(32)
);
CREATE TABLE product_tag
(
  `product_id` int, 
  `tag_id` int
);

示例数据(基于您的):

产品: 标签: product_tag:

| 身份证 | 标题 | | 身份证 | 价值 | | PRODUCT_ID | TAG_ID |
------------------ -------------------------------- --------
| 1 | 苹果5 | | 1 | 电视 | | 1 | 1 |
| 2 | 银河S4 | | 2 | 领导| | 2 | 1 |
                    | 3 | 三星 | | 1 | 2 |
                    | 4 | 苹果| 高分辨率照片| CLIPARTO | 2 | 2 |
                    | 5 | 安卓 | | 2 | 3 |
                    | 6 | iOS | | 1 | 4 |
                    | 7 | 4GB | | 2 | 5 |
                    | 8 | 64GB | | 1 | 6 |
                                      | 2 | 7 |
                                      | 1 | 8 |

现在要获取具有一个或多个这些标签('4GB'、'led'、'android'、'tv')的产品,按相关标签的数量(排名)排序,您可以使用这样的查询

SELECT p.*
  FROM products p JOIN 
(
  SELECT pt.product_id, COUNT(*) rank
    FROM product_tag pt JOIN tags t
      ON pt.tag_id = t.id
   WHERE t.value IN ('4GB', 'led', 'android', 'tv')
   GROUP BY pt.product_id
) q ON p.id = q.product_id
 ORDER BY q.rank DESC

样本输出:

| 身份证 | 标题 |
------------------
| 2 | 银河S4 |
| 1 | 苹果5 |

这是SQLFiddle演示

于 2013-08-05T05:13:17.537 回答