SQL从T2中选择T1中的某些内容

时间:2011-04-05 09:56:07

标签: sql select

我有两个表,一个包含ID和消息,另一个包含用户名和消息ID(例如:

T2结构:

CREATE TABLE `messages` (
`messageID` int NOT NULL AUTO_INCREMENT,
`message` varchar(8192) NOT NULL default '',
PRIMARY KEY (`messageID`)
);

T1结构:

CREATE TABLE messageID(
`username` varchar(10) NOT NULL default '',
`messageID1` int(11) NOT NULL default '0',
`messageID2` int(11) NOT NULL default '0',
`messageID3` int(11) NOT NULL default '0',
`messageID4` int(11) NOT NULL default '0',
`messageID5` int(11) NOT NULL default '0',
`messageID6` int(11) NOT NULL default '0',
`messageID7` int(11) NOT NULL default '0',
`messageID8` int(11) NOT NULL default '0',
`messageID9` int(11) NOT NULL default '0',
`messageID10` int(11) NOT NULL default '0',
PRIMARY KEY (`username`)
);

我想从消息表中选择所有“消息”字段,其中用户名具有这些消息ID(希望有意义......)。例如。用户有messageID1 = 1; messageID2 = 5;我想从messageID = 1&&的消息中返回“消息”。 MESSAGEID = 5。

我知道如何在多个语句中执行此操作,但我更愿意只执行一个语句(即使它是一个缓慢的语句)

如果我能找到更好的方式来描述我需要的东西,我会改变问题的措辞。

谢谢。

3 个答案:

答案 0 :(得分:2)

您的挣扎是因为您的数据库设计存在缺陷。

您通过跨列重复群组来打破First normal form

从外观上看,一个用户可以拥有多条消息。

Users (UserID, Username)

Messages (MessageID, UserID, MsgOrder)

然后你可以做

SELECT * FROM Messages 
JOIN Users ON Messages.UserID = Users.UserID 
WHERE Users.Username = `Username`
     AND (MsgOrder = 1 OR MsgOrder = 5)

如果许多用户可以引用相同的消息,那么您将拥有多对多的关系并需要junction table

Users (UserID, Username)

Messages (MessageID, Message)

User_Messages (UserID, MessageID, MsgOrder)

如果您无法更改数据库架构,那么您将陷入某种循环,或多个查询与UNION

相结合

答案 1 :(得分:1)

我不太确定我是否正确理解了这个问题。 你可能需要一个循环......

这是你想要的吗?

int i = 1;
while(i<11){
    String msgQuery = "SELECT message FROM messages WHERE messageID IN (SELECT messageID"+i+"FROM messageID)";
.
.
.
}

答案 2 :(得分:0)

也许是这样的?

SELECT messages.message FROM (
   SELECT username, messageID1 as messageID from messageID
   UNION
   SELECT username, messageID2 as messageID from messageID
   UNION
   SELECT username, messageID3 as messageID from messageID
   UNION
   SELECT username, messageID4 as messageID from messageID
   UNION
   SELECT username, messageID5 as messageID from messageID
   UNION
   SELECT username, messageID6 as messageID from messageID
   UNION
   SELECT username, messageID7 as messageID from messageID
   UNION
   SELECT username, messageID8 as messageID from messageID
   UNION
   SELECT username, messageID9 as messageID from messageID
   UNION
   SELECT username, messageID10 as messageID from messageID
) m JOIN messages ON m.messageID = messages.messageID 
WHERE m.username = ?