javascript 如何基于包含数组值的列对行进行排序(PHP/MySQL/jQuery)

z5btuh9x  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(133)

首先,我应该说,我正在寻找一个解决方案与php/mysql和JS/jQuery,但我不知道什么将是最好的一般方法为较大的数据集(40.000+)。
假设你有一个数据库,并且希望能够根据一列和包含数组的单元格对表进行排序。例如,一个人可以有多个职业,例如。

Person A - [actor, screenwriter, director]
Person B - [premier minister, president, actor]

想象一下,既然有很多不同的职业,而且大部分人都有多个职业,所以每个人的职业都存储在一个数组中,你还能怎么存储它们呢?
所以我想我会收集所有的人,以及他们所有的职业数组,并删除重复项,以得到一个所有可能职业的列表,然后创建一个表,并为每个职业给予一个ID,然后将这些ID分配给拥有相应职业的人,所以我得到了这样的结果

id 1 - actor
id 2 - screenwriter
id 3 - director
id 4 - premier minister
id 5 - president
...

在personers表的professors列中:

Person A - [1, 2, 3]
Person B - [4, 5, 1]

因此,当然我可以只创建一个搜索栏的列或过滤器复选框过滤职业找到所有演员,所有总统等提供了一个复选框为每个职业。
但是:即使我将每个数组按升序排列,以显示给用户看啊,这里是所有的参与者,因为你在结果的前几页中专业列的每个单元格中看到的第一个单词看起来会很好,例如。

Person A - [(a)ctor, (d)irector, (s)creenwriter]
Person C - [(a)ctor, (p)remier minister, (p)resident]
...

但是当你继续往下看时会发生什么呢?当你看到以D开头的职业时,你不会发现那些拥有任何以“A”开头的职业的人,因为他们已经显示在“A”下面了,因为我们是按升序排序的。
不如这样:
现在,如果你想按职业来对这些提升者进行分类,你会希望得到这样一个列表:

Person A - (a)ctor
Person B - (a)ctor
Person C - (a)ctor
...
Person A - (d)irector
Person D - (d)irector
...
Person B - (p)remier minister
Person E - (p)remier minister
...

从而当条目在“D”下也具有以“D”开头的职业时,条目被“复制”以稍后显示。
我真的希望我解释得足够好,如果没有请问!
我很乐意听听你的建议,比如你对这方面的研究,代码示例,以及如何以最佳方式实现这一点的建议。我想学习它。也许你甚至会推荐一种完全不同的方法,不做太多排序工作,而是进行过滤和搜索,因为排序/显示条目机制的想法可能只是有一个局限性。
我将非常感谢任何帮助!

c3frrgcw

c3frrgcw1#

推荐结构:
人员表:

CREATE TABLE Person (
    person_id INT AUTO_INCREMENT PRIMARY KEY,
    person_name VARCHAR(255),
    -- another columns related to person
    );

职业表:

CREATE TABLE Profession (
    profession_id INT AUTO_INCREMENT PRIMARY KEY,
    profession_name VARCHAR(255),
    -- another columns related to profession
    );

邻接表:

CREATE TABLE PersonToProfession (
    person_id INT NOT NULL,
    profession_id INT NOT NULL,
    PRIMARY KEY (person_id, profession_id),
    FOREIGN KEY (person_id) REFERENCES Person (person_id),
    FOREIGN KEY (profession_id) REFERENCES Profession (profession_id)
    );

在此结构上,查询很简单:

-- show all persons with lexically first profession
SELECT person_name, 
       ( SELECT profession_name 
         FROM Profession pr
         JOIN PersonToProfession ptp USING (profession_id)
         WHERE pe.person_id = ptp.person_id
         ORDER BY pr.profession_name ASC LIMIT 1 ) profession_name 
FROM Person pe
ORDER BY 1, 2;

DEMO

相关问题