如何通过PHP按三列(具有类似信息)排序?

如何通过PHP按三列(具有类似信息)排序?,php,mysql,Php,Mysql,我有一个包含以下列的表格(“演示文稿”): PresentationTitle | Speaker1 | Speaker2 | Speaker3 这非常适合在我的“演示文稿”页面上列出所有类似的演示文稿标题: 但是现在,对于我的“演讲者”页面,我需要按字母顺序列出所有演讲者——彼此独立。像这样: Chief Powhatan Grandmother Willow John Rolfe John Smith Kocoum Derpyderpderp Pocahontas Smith 最好的方法

我有一个包含以下列的表格(“演示文稿”):

PresentationTitle | Speaker1 | Speaker2 | Speaker3
这非常适合在我的“演示文稿”页面上列出所有类似的演示文稿标题:

但是现在,对于我的“演讲者”页面,我需要按字母顺序列出所有演讲者——彼此独立。像这样:

Chief Powhatan
Grandmother Willow
John Rolfe
John Smith
Kocoum Derpyderpderp
Pocahontas Smith
最好的方法是什么

另一个注意事项——在我的现实生活表格中,speaker1列附带了更多的列——“middlename”、“lastname”、“headshot”、“age”。。。而且,说话者2有“中间名2”、“最新名2”、“头像2”等。。。我需要把这些信息附在那些发言者身上


提前感谢您帮助像我这样的大人物:)

对于您来说,一个相当简单的方法是在HTML表格中列出适用于“演讲者”的任何数据,然后使该表格可排序

我使用了来自的JavaScript使我的HTML表可排序,它工作得非常好。还有其他可排序HTML表的实现


这样,您就不必忙于创建MySQL视图和/或过程,也不必在PHP脚本中进行复杂的处理…

对于您来说,一个相当简单的方法是在HTML表中列出适用于“演讲者”的任何数据,然后对该表进行排序

我使用了来自的JavaScript使我的HTML表可排序,它工作得非常好。还有其他可排序HTML表的实现


这样,您就不必乱搞MySQL视图和/或过程,也不必在PHP脚本中进行复杂的处理…

您应该重新考虑数据库设计。更好的表格布局更像:

CREATE TABLE presentations (
    presentationID INT,
    presentationTitle VARCHAR(200),
    PRIMARY KEY (presentationID)
);

CREATE TABLE speakers (
    speakerID INT,
    firstName VARCHAR(32),
    middleName VARCHAR(32),
    lastName VARCHAR(32),
    headshot BLOB,
    age TINYINT UNSIGNED,
    PRIMARY KEY (speakerID)
);

CREATE TABLE presentationSpeakers (
    presentationID INT,
    speakerID INT
);
然后,您可以执行如下查询,以按姓名的字母顺序列出特定演示文稿中的所有发言者:

SELECT
    s.firstName,
    s.lastName
FROM
    presentationSpeakers ps
    INNER JOIN presentations p ON ps.presentationID = p.presentationID
    INNER JOIN speakers s ON ps.speakerID = s.speakerID
WHERE
    p.presentationTitle = 'Presentation Number One'
ORDER BY
    s.firstName, s.lastName
SELECT firstName, lastName FROM speakers ORDER BY firstName, s.lastName
或者按照姓名的字母顺序对所有发言者进行如下简单的查询:

SELECT
    s.firstName,
    s.lastName
FROM
    presentationSpeakers ps
    INNER JOIN presentations p ON ps.presentationID = p.presentationID
    INNER JOIN speakers s ON ps.speakerID = s.speakerID
WHERE
    p.presentationTitle = 'Presentation Number One'
ORDER BY
    s.firstName, s.lastName
SELECT firstName, lastName FROM speakers ORDER BY firstName, s.lastName
由于许多原因,这样做更好。每个演讲者都有一堆额外的专栏是很难处理的(这就是你现在遇到的麻烦),而且你会有大量的专栏可能无法使用(取决于演讲者的数量),这可能会浪费空间,还有另一个重要原因……如果你得到一个演讲,演讲的人比你的专栏多怎么办


我的方法更灵活,更容易执行简单的操作(如排序)。每个演示文稿都可以有任意数量的演讲者,而且不用的列不会浪费空间。

您应该重新考虑数据库设计。更好的表格布局更像:

CREATE TABLE presentations (
    presentationID INT,
    presentationTitle VARCHAR(200),
    PRIMARY KEY (presentationID)
);

CREATE TABLE speakers (
    speakerID INT,
    firstName VARCHAR(32),
    middleName VARCHAR(32),
    lastName VARCHAR(32),
    headshot BLOB,
    age TINYINT UNSIGNED,
    PRIMARY KEY (speakerID)
);

CREATE TABLE presentationSpeakers (
    presentationID INT,
    speakerID INT
);
然后,您可以执行如下查询,以按姓名的字母顺序列出特定演示文稿中的所有发言者:

SELECT
    s.firstName,
    s.lastName
FROM
    presentationSpeakers ps
    INNER JOIN presentations p ON ps.presentationID = p.presentationID
    INNER JOIN speakers s ON ps.speakerID = s.speakerID
WHERE
    p.presentationTitle = 'Presentation Number One'
ORDER BY
    s.firstName, s.lastName
SELECT firstName, lastName FROM speakers ORDER BY firstName, s.lastName
或者按照姓名的字母顺序对所有发言者进行如下简单的查询:

SELECT
    s.firstName,
    s.lastName
FROM
    presentationSpeakers ps
    INNER JOIN presentations p ON ps.presentationID = p.presentationID
    INNER JOIN speakers s ON ps.speakerID = s.speakerID
WHERE
    p.presentationTitle = 'Presentation Number One'
ORDER BY
    s.firstName, s.lastName
SELECT firstName, lastName FROM speakers ORDER BY firstName, s.lastName
由于许多原因,这样做更好。每个演讲者都有一堆额外的专栏是很难处理的(这就是你现在遇到的麻烦),而且你会有大量的专栏可能无法使用(取决于演讲者的数量),这可能会浪费空间,还有另一个重要原因……如果你得到一个演讲,演讲的人比你的专栏多怎么办

我的方法更灵活,更容易执行简单的操作(如排序)。您可以为每个演示文稿安排任意数量的演讲者,并且不存在未使用列占用的浪费空间。

您的问题是:

最好的方法是什么

嗯,主要问题在于你的桌子设计

如果您有以下表格:
PresentationTitle、Speaker1、Speaker2、Speaker3

如果不是所有演示文稿都有3个扬声器,则说明您的设计很糟糕:)

您应该有这样一个
Presentation
表:
PresentationId,PresentationTitle

另一个名为
Speakers
的表格如下:
SpeakerId,SpeakerName

然后,由于您可以让一位演讲者进行多个演讲,并且一个演讲有多个演讲者,因此您有一个多对多关系,根据经验,这总是会生成一个新表

在这种情况下,它将是这个表
Presentation\u Speaker
PresentationId,SpeakerId
(两个字段都是主键)

那么,既然你在用“最佳方式”做事,你怎么能找回所有的扬声器呢?仅运行此查询:

select * from speakers
现在,如果您不想按照前面的步骤正确行事,我只想回答您的问题,让这3个演讲者专栏中的所有演讲者发言:

(select speaker1 Speaker from presentations)
union
(select speaker2 from presentations)
union
(select speaker3 from presentations)
order by Speaker
重复的扬声器将被删除

附言:我没有得到你的“现实生活的例子”:

speaker1列附加了更多的列

你是什么意思?

你的问题是:

最好的方法是什么

嗯,主要问题在于你的桌子设计

如果您有以下表格:
PresentationTitle、Speaker1、Speaker2、Speaker3

如果不是所有演示文稿都有3个扬声器,则说明您的设计很糟糕:)

您应该有这样一个
Presentation
表:
PresentationId,PresentationTitle

另一个名为
Speakers
的表格如下:
SpeakerId,SpeakerName

然后,由于您可以让一位演讲者进行多个演讲,并且一个演讲有多个演讲者,因此您有一个多对多关系,根据经验,这总是会生成一个新表

在这种情况下,它将是这个表
Presentation\u Speaker
PresentationId,SpeakerId
(两个字段都是主键)

那么,既然你在用“最佳方式”做事,你怎么能找回所有的扬声器呢?仅运行此查询:

select * from speakers
现在,如果你不想