简体   繁体   English

不同的表格字段标签

[英]Distinct Table field tags

I have a table with a field (cat_tags) which contain the following rows:- 我有一个带有字段(cat_tags)的表,其中包含以下行:

    id - cat_tags - date_added
    1 -   yam, potato, onion, pepper,beans - 23-12-2011
    row1 - yam, potato, onion, pepper  23-12-2011
    row2 - onion, pepper, beans - 23-12-2011
    row3 - pepper, beans, rice - 23-12-2011
    row4 - rice, potato, pepper, yam -  23-12-2011
    row5 - beans, rice, onion, food -  23-12-2011
    .....
    .....
    .....

pls how can I get a DISTINCT list of items and the number of times(frequency) they occurred in the entire table field? 请问如何获得一个DISTINCT项目列表以及它们在整个表字段中出现的次数(频率)?

Eg. 例如。 pepper x 4 胡椒粉x 4
onion x 3 洋葱x 3
yam x 2 山药x 2

thank you in advance 先感谢您

First normalize your table(s). 首先规范化您的表。

Table tags
    id unsigned integer autoincrement primary key,
    tag varchar(40) not null,
    unique index tag(tag)

Table Item_tags
    id unsigned integer autoincrement primary key,
    tag_id integer not null,
    item_id integer not null

Table items
    id unsigned integer autoincrement primary key,
    date_added date not null

Insert an item into your database using the following series of queries: 使用以下一系列查询将项目插入数据库:

INSERT INTO Items VALUES (null, NOW());
SELECT @last_item_id:= LAST_INSERT_ID();

REPLACE IGNORE INTO tags (tag) VALUES ('pepper', 'onion', 'rice')

INSERT INTO Item_tags 
  SELECT 
    null as id
    , tags.id 
    , last_item_id
  FROM tags WHERE tags.tag IN ('pepper', 'onion', 'rice')

If you want to simplify the addition of items and streamline your php code, 如果您想简化项目的添加并简化php代码,
use a blackhole table and a trigger on that table. 使用黑洞表和该表上的触发器。

CREATE TABLE bh_items (
  id unsigned integer autoincrement primary key,
  date_added timestamp,
  tag1 varchar(45) not null, 
  tag2 varchar(45) default null,
  tag3 varchar(45) default null,
  tag4 varchar(45) default null,
  tag5 varchar(45) default null,
  tag6 varchar(45) default null,
  tag7 varchar(45) default null,
  tag8 varchar(45) default null,
  tag9 varchar(45) default null,
  tag10 varchar(45) default null) ENGINE = blackhole;

DELIMITER $$

CREATE TRIGGER ai_bn_items_each AFTER INSERT ON bh_items FOR EACH ROW
BEGIN
  DECLARE last_item_id integer;

  INSERT INTO Items VALUES (null, new.date_added);
  SELECT LAST_INSERT_ID() INTO last_item_id;

  REPLACE IGNORE INTO tags ((null, new.tag1)
                           ,(null, new.tag2)
                           ,(null, new.tag3)
                           ,(null, new.tag4)
                           ,(null, new.tag5)
                           ,(null, new.tag6)
                           ,(null, new.tag7)
                           ,(null, new.tag8)
                           ,(null, new.tag9)
                           ,(null, new.tag10));

    INSERT IGNORE INTO item_tags (item_id, tag_id)
      SELECT last_item_id, tags.tag FROM tags 
      WHERE tags.tag 
        IN (new.tag1, new.tag2, new.tag3, new.tag4, new,tag5
          , new.tag6, new.tag7, new.tag8, new.tag9, new.tag10);
END $$

DELIMITER ;

If you use the trigger you can just insert into the blackhole table and the trigger will then update all your 3 tables. 如果使用触发器,则只需将其插入黑洞表中,然后触发器将更新所有3个表。

INSERT INTO bh_items VALUES (null, null, 'onion', 'rice', 'pepper'
                             , null, null, null, null, null, null, null)

All your tables will be automagically updated. 您所有的表格都会自动更新。

Back to your question 回到您的问题

You can then select from this using this query: 然后,您可以使用以下查询从中进行选择:

SELECT tags.tag, COUNT(*) as freq FROM item_tags 
INNER JOIN tags ON (item_tags.tag_id = tags.id)
GROUP BY item_tags.tag_id

Links: 链接:
blackhole: http://dev.mysql.com/doc/refman/5.1/en/blackhole-storage-engine.html 黑洞: http : //dev.mysql.com/doc/refman/5.1/en/blackhole-storage-engine.html
replace into: http://dev.mysql.com/doc/refman/5.1/en/replace.html 替换为: http : //dev.mysql.com/doc/refman/5.1/en/replace.html
Triggers: http://dev.mysql.com/doc/refman/5.1/en/triggers.html 触发条件: http//dev.mysql.com/doc/refman/5.1/en/triggers.html
Create table: http://dev.mysql.com/doc/refman/5.1/en/create-table.html 创建表: http : //dev.mysql.com/doc/refman/5.1/en/create-table.html

You should first normalize your table structure. 您应该首先规范化您的表结构。 It is not compliant with the first normal form, making the requested operation way more complicated than it needs to be. 它不符合第一个标准格式,使请求的操作方式比所需的复杂。

If I have understood your question correctly, this should work: 如果我正确理解了您的问题,那么应该可以:

    $result = mysql_query("SELECT cat_tags FROM table");

    while($row = mysql_fetch_array($result))
    {
        //Split the row into an array based on the comma
        $detail_array = explode(",", $row['cat_tags']);

        //Go through that array and index a master count for each occurence of the same value 
        //Trim due to the spaces after the comma in your field
        foreach($detail_array as $key=>$val)
        {
            $output_array[trim($val)] = $output_array[trim($val)] + 1;  
        }   
    }

    print_r($output_array);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM