Mysql在一个查询中使用连接表进行搜索和排序

时间:2011-02-16 13:18:41

标签: mysql join where-clause

我在Mysql 5中有3个表。

Table Client: ID, Username, Password.
Table Client_Data: ID, Dataname
Table Client_Client_Data: client_id, Data_id, Value

我的想法是,我可以让这个软件的用户确定他想从他的客户那里获得哪些信息。 Client_Data表通常用“名字”,“姓氏”,“地址”等填充。第三个表将一起加入表。一个例子:

Client: ID=1 Username=Bert01 Password=92382938v2nvn239
Client_Data: ID=1 Dataname=First Name
Client_Client_Data: client_id=1 data_id=1 value=Bert

这意味着在选择查询中加入表时,Bert01的名字为“Bert”。

我在一个表中显示所有这些,其中列是DataName值(如果你在这里丢失我:标题将像“名字”,“姓氏”等)。我希望能够按字母顺序为每列排序这些数据。

我的解决方案是使用2个查询。第一个将使用WHERE Client_Data.Dataname = $sortBy ORDER BY Client_Client_Data.value收集数据,然后第二个查询将使用WHERE Client.ID = 1 OR 2 OR 3收集包含第一个查询中收集的所有ID的其他数据。这很有效。

长期以来一直在我脑海中浮现的问题是我想要搜索我的数据。如果不是为了排序,这不会太难。搜索完成后,表格将包含结果,但此表格必须按照以前的方式进行排序。

有没有人知道如何在不打扰网络服务器的内存的情况下通过循环潜在的数千个客户端来做到这一点? (意思是:我想在Mysql中这样做)。

如果您的解决方案需要更改表而不会丢失存储此类数据的能力:那就不会有问题。

1 个答案:

答案 0 :(得分:1)

你可以重新定位循环。从所有数据类型中选择

Select * from Client_Data

然后使用该信息构建一个类似的查询(伪代码)

orderby = "name"
query = "select *"
foreach(datatypes as dt){
 query += ",(select d.value from Client_Client_Data as d where d.data_id="+dt.ID+" and d.client_id=cl.ID) as "+dt.Dataname
}
query = "from Client as cl order by "+orderby;

这将导致一个表,其中所有可用的数据类型都转移到一列中,并且相应的值通过d.client_id=cl.ID连接到正确的客户端

而cl.ID是指主查询客户端ID,并将其与Client_Client_Data.client_id匹配

现在要注意我不完全确定子查询更有效。需要一些测试