2011-02-16 119 views
1

我在MySQL 3台分拣5.Mysql的搜索和在一个查询中与连接表

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的数据,然后第二个查询将收集包含第一个查询中收集的所有ID的WHERE Client.ID = 1 OR 2 OR 3的其他数据。这很好。

现在我脑海里一直玩的问题是当我想搜索我的数据。如果不是为了排序,这不会太难。搜索完成后,表格将包含结果,但该表格必须按照与之前相同的方式排序。

有没有人有任何想法如何做到这一点,而不会打扰通过潜在数千客户端循环浏览器的内存? (意思是:我想在Mysql中这样做)。

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

+0

这不是一个真正的密码,是吗? :) – 2011-02-16 16:48:51

回答

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

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

+0

我会在24小时内将此标记为答案。如果有人能想出一个不包含1-n子查询的解决方案,那么我会很乐意听到这个解决方案。这工作(只是测试),并且比“在PHP中循环”解决方案少得多的资源密集,所以谢谢Youri。 – 2011-02-16 17:55:40