MySql搜索字段中的数组元素

时间:2017-12-26 11:18:53

标签: php mysql

我有下表

 title               year        authors
 --------------------------------------------------------------------------
 title book 1        2015-12-01        White McGregor Waine
 title book 2        2016-10-14        McGregor Bush Rossi
 title book 3        2017-05-22        Bush McGregor Lopes
 ......              ....              .......

作者字段由用空格分隔的名称组成(如果需要,我也可以使用不同的分隔字符。)

如何推断出版更多图书的作者的desc列表?考虑一下我不知道作者的名字。

在示例中,列表是:

 Author                 Books published
 --------------------------------------- 
 McGregor                     3     
 Bush                         2
 Whaite                       1
 Whaine                       1
 Rossi                        1
 Lopes                        1

3 个答案:

答案 0 :(得分:3)

这样做的恰当方法是规范化。

这属于多对多关系。

为了存储多对多关系,需要主要存储每个关系的主键(ID)的中间表。在你的情况下,

  

authors_table(author_id,name,...)

     

books_table(book_id,name,...)

     

authors_books_table(id,author_id,book_id)

Here是一个更详细的解释。

然后进行简单的连接,将获得所需的结果。

答案 1 :(得分:2)

首先,你必须学习Normalization。数据库规范化或简单规范化是组织关系数据库的列(属性)和表(关系)以减少数据冗余和提高数据完整性的过程。 ......非正式地,关系数据库关系通常被描述为"标准化"如果它符合第三范式。

你也可以试试这个

"""
Interceptor example using ICMP

ADD this rule:
sudo iptables -I INPUT 1 -p icmp -j NFQUEUE --queue-balance 0:2
"""
import time
from multiprocessing import Process
import os
from pypacker import interceptor
from pypacker.layer3 import ip

class TrafficMonitor(object):
    # ICMP Echo request intercepting
    def verdict_cb(self, ll_data, ll_proto_id, data, ctx):
        # ip1 = ip.IP(data)
        ip1 = ip.IP(data)


        print('\n---------->Packet recieved:\n\t source ip:%s , the dst ip:%s, \n\npacket_info:%s '
            %(ip1.src_s, ip1.dst_s, ip1))
        return ip1.bin(), interceptor.NF_ACCEPT

    def dpi_start(self, queue_id):
        print('queue', queue_id)
        ictor = interceptor.Interceptor()
        # queue = [0, 1, 2]
        ictor.start(self.verdict_cb, queue_ids=queue_id)


def start_int():
    monitor = TrafficMonitor()
    proc = Process(target=monitor.dpi_start, args=([0, 1, 2],))
    proc.start()


if __name__ == '__main__':
    while True :
        a = input('press y to start: ')
        if a == 'y':
            start_int()

        elif a == 'x':
            os._exit(0)

答案 2 :(得分:1)

正如其他人已经指出的那样,您需要规范化您的数据库。规范化的优点包括但不限于以下内容:

  • 您将更容易找到您感兴趣的数据,在您的情况下,您将能够找到给定表中的作者以及中间表中的关系,而不是使用空格处理varchars
  • 您的数据库将保持一致,也就是说,您将能够轻松处理作者的CRUD操作,例如,如果您在authors表中更改作者的名称,则将更改作者所在的所有位置引用于。此外,您将能够区分具有相同名称的作者
  • 您不会存储冗余数据,从而增加了您拥有的数据的大小

因此,您将拥有以下表格:

作者(身份证,姓名)

author_of_book(id,author_id,book_id)

书籍(身份证,头衔,年份)

确保id字段是主键,author_id和book_id分别是外键。

使用这种新结构,您可以像这样进行所需的选择:

select authors.name, count(*) as `books published`
from authors
join author_of_books
on authors.id = author_of_books.author_id
join books
on author_of_books.book_id = books.id
group by authors.id, authors.name
order by count(*) desc