【问题标题】:Mysql searching and sorting in one query with joined tablesMysql 在一个查询中使用连接表进行搜索和排序
【发布时间】:2011-06-28 08:43:28
【问题描述】:

我在 Mysql 5 中有 3 个表。

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

我的想法是,我可以让这个软件的用户决定他想从他的客户那里获得哪些信息。 Client_Data 表通常会填充“First Name”、“Last Name”、“Address”等。第三个表将这些表连接在一起。一个例子:

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 值(如果您在这里丢失了我:标题将类似于“First Name”、“Last Name”等等)。我希望能够为每一列按字母顺序对这些数据进行排序。

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

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

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

如果您的解决方案需要在不丢失存储此类数据的能力的情况下更改表:那没问题。

【问题讨论】:

  • 这不是真正的密码,是吗? :)

标签: mysql join where-clause


【解决方案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 匹配

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

【讨论】:

  • 我会在 24 小时内将此标记为答案。如果有人能提出一个不包含 1-n 子查询的解决方案,我会很高兴听到这个消息。这很有效(刚刚测试过),并且比“循环在 php 中”解决方案占用的资源要少得多,所以谢谢 Youri。
猜你喜欢
  • 2021-02-11
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多