2012-01-27 74 views
0

我有以下情况:如何从一个表中连接多个字段并将结果与​​另一个表中的另一个字段进行比较?

table 1 -> publications 

table 2 -> users 

在表中的一个出版物的一些细节中,我有一个关于作者20场,正是他们的名字和lastnames(以下字段:n1, l1, n2, l2, n3, l3...等)。

在表二中,我有一个字段包含用户的姓名和姓氏。

我想只显示这些出版物,其中名称,并从表1中的姓氏将是相同的名称,并从表中的姓氏2.

这里是到目前为止我的查询:

$sql ="SELECT *, concat_ws(' ',n1,l1), concat_ws(' ',n2,l2) AS my 
     FROM #__publications WHERE my IN 
     (SELECT name FROM #__users WHERE name = '".$l_user."')"; 

我知道我的想法可能是错误的。你可以帮帮我吗?如果您能给我一些建议,我将不胜感激。

回答

1

您应该从Publications表中删除作者,并创建一个链接用户与出版物的第三个表。

PublicationAuthors 

PublicationID int 
UserID int 

然后,您的查询可以检查该表以查看用户是否与发布相关联。此外,您可以根据需要选择尽可能多的作者,而无需为出版物添加新列,并且如果有人更改其名称,则不会破坏与出版物的关系。

下面是一个例子(我使用SQL Server会为这样可能会有小的语法差异):当你意识到我拼错了作者的姓氏

CREATE TABLE Publications(
    [PublicationID] [int] IDENTITY(1,1) NOT NULL, 
    [Title] [nvarchar](128) NOT NULL, 
    [DatePublished] [DateTime] 
PRIMARY KEY CLUSTERED 
(
    [PublicationID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

CREATE TABLE Authors(
    [AuthorID] [int] IDENTITY(1,1) NOT NULL, 
    [FirstName] [nvarchar](128) NOT NULL, 
    [LastName] [nvarchar](128) NOT NULL 
PRIMARY KEY CLUSTERED 
(
    [AuthorID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 


CREATE TABLE PublicationAuthors(
    [PublicationID] [int], 
    [AuthorID] [int] 
PRIMARY KEY CLUSTERED 
(
    [PublicationID] ASC, 
    [AuthorID] 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 


INSERT INTO Publications (Title, DatePublished) VALUES ('Sphere', '5/12/1987') 
INSERT INTO Publications (Title, DatePublished) VALUES ('Jurassic Park', '11/1/1990') 
INSERT INTO Authors (FirstName, LastName) VALUES ('Michael', 'Chricton') 
INSERT INTO Authors (FirstName, LastName) VALUES ('Andy', 'McKenna') 
INSERT INTO PublicationAuthors (PublicationID, AuthorID) VALUES (1, 1) 
INSERT INTO PublicationAuthors (PublicationID, AuthorID) VALUES (2, 1) 
INSERT INTO PublicationAuthors (PublicationID, AuthorID) VALUES (2, 2) 

--All Authors for this Publication 
SELECT p.Title, p.DatePublished, a.FirstName, a.LastName 
FROM Publications p 
INNER JOIN PublicationAuthors pa 
    ON pa.PublicationID = p.PublicationID 
INNER JOIN Authors a 
    ON a.AuthorID = pa.AuthorID 
WHERE p.PublicationID = 2 

--All Publications for this Author 
SELECT p.Title, p.DatePublished, a.FirstName, a.LastName 
FROM Authors a 
INNER JOIN PublicationAuthors pa 
    ON pa.AuthorID = a.AuthorID 
INNER JOIN Publications p 
    ON pa.PublicationID = p.PublicationID 
WHERE a.AuthorID = 1 

然后,你可以只更新一排无触摸出版物表。

+0

谢谢您的解答。 我不确定我是否了解你。 因此,我从Publications表中移除作者并创建下一个表PublicationAuthors。接下来我放在那里:'作者姓名和姓氏,publication_id和user_id'。一位作者可能有许多出版物,并且有可能作者不是用户,所以在这种情况下,我必须在PublicationAuthors表中添加新列。如果作者写了一个新的 – Delicja 2012-01-28 11:21:40

+0

如果作者写了一个新的发布,我应该添加一个新字段 - 一个新的publication_id或者向具有相同作者的表添加一个新记录。 – Delicja 2012-01-28 11:29:12

+0

不,您需要将publication_id从作者/用户表中分离出来。您需要第三个表格,它只是作者到出版物的映射。这样你有1个不同的出版物记录和1个不同的作者记录。如果该作者被附加到另一个出版物,那么你所做的就是向映射表添加一条新记录。在这里阅读更多关于数据标准化的内容:http://en.wikipedia.org/wiki/Database_normalization – AndyMcKenna 2012-01-31 13:17:12

0

您可能会发现将用户表设置为包含user_id字段作为主键并将其用作发布表中的索引会更容易。

CREATE TABLE __users 
(
    user_id int(11) unsigned not null auto_increment, 
    name varchar(32) not null default '', 
    .... snip .... 
    PRIMARY KEY (user_id) 
); 

CREATE TABLE __publications 
(
    publication_id int(11) unsigned not null auto_increment, 
    user_id1 int(11) unsigned not null default 0, 
    user_id2 int(11) unsigned not null default 0, 
    n1 varchar(32) not null default '', 
    l1 varchar(32) not null default '', 
    n2 varchar(32) not null default '', 
    l2 varchar(32) not null default '', 
    .... snip .... 
    PRIMARY KEY (publication_id), 
    INDEX user_id1 (user_id1), 
    INDEX user_id2 (user_id2) 
); 

SELECT p.*, concat_ws(' ', p.n1, p.l1) AS author1, concat_ws(' ', p.n2, p.l2) AS author2 
FROM __users AS u 
JOIN __publications AS p ON (u.user_id = p.user_id1 OR u.user_id = p.user_id2) 
WHERE u.name = $1_user 
GROUP BY p.publication_id 

或者你可以进行加入这样的:

SELECT p.*, concat_ws(' ', p.n1, p.l1) AS author1, concat_ws(' ', p.n2, p.l2) AS author2 
FROM __users AS u 
JOIN __publications AS p ON (u.name = concat_ws(' ', p.n1, p.l1) OR u.name = concat_ws(' ', p.n2, p.l2)) 
WHERE u.name = $1_user 
GROUP BY p.publication_id 
+0

谢谢汤姆的回答。我会尝试。 – Delicja 2012-01-28 11:30:55

相关问题