在一个查询中加入3个mySQL表

时间:2011-10-08 09:35:15

标签: mysql sql

我花了最后几个小时试图找出如何生成适当的MySQL查询来访问我的数据。这是我的sql表结构:

CREATE TABLE IF NOT EXISTS `record` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `client` int(11) NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
)

CREATE TABLE IF NOT EXISTS `clip` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `record` int(11) NOT NULL,
  `data` int(11) NOT NULL,
)

CREATE TABLE IF NOT EXISTS `data` (
  `clip` int(11) NOT NULL,
  `name` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `value` text COLLATE utf8_unicode_ci NOT NULL,
)

我尽可能地减少了表格。 记录表包含客户端数据,然后 clip 用于将此客户端与存储在 data 中的某些客户端参数相连接。每个客户端可以根据需要拥有尽可能多的记录,并且每个记录由未确定数量的* clip * s组成。然后,每个剪辑引用一些数据值。

好的,我正在寻找的查询是一个给出数据 *名称*和的查询完成条件的最后一个( date )* client * s name = * given_name * AND value = * given_value *。是的,我正在寻找在数据库中存储的LAST记录中完成该条件的客户端。

我到了这句话:

SELECT client
FROM clip, record 
WHERE clip.id IN (SELECT clip FROM `data` WHERE name='level' AND value='2')

但是它返回所有客户端,不仅是最后的客户端,而且我的所有测试包括 date 都没有成功。

编辑:经过一些尝试和错误,感谢你给我的想法,我已经到了一个似乎有用的查询,但它确实非常复杂,我很确定你可以帮我简化:

SELECT * FROM clip, data
WHERE data.clip=clip.id 
 AND record IN (SELECT id
  FROM record a
  WHERE date = (
    SELECT MAX(date)
    FROM record b
    WHERE a.client = b.client
    )
 )
 AND data.name='NAME_HERE' AND data.value='VALUE_HERE'

嗯,这不是我想要的,我需要客户端ID,但它给了我这个客户端的最后一条记录对我来说足够了。

3 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,请查看这是否适合您:

SELECT client
FROM record, clip, data
WHERE name = "given_name" AND value = "given_value"
AND data.clip = clip.id
AND clip.record = record.id
ORDER BY date DESC
LIMIT 0,1

根据您的评论更新了查询:

SELECT client, MAX(date)
FROM record, clip, data
WHERE name = "given_name" AND value = "given_value"
AND data.clip = clip.id
AND clip.record = record.id
GROUP BY client

您发布了一些数据和所需的输出是很有帮助的。我已经更新了以下查询:

SELECT record.client
FROM clip JOIN data ON (data.clip = clip.id)
JOIN record ON (clip.record = record.id)
JOIN (
   SELECT client, MAX(date) as date
   FROM record
   GROUP BY client
) AS r ON (r.client = record.client AND r.date = record.date)
WHERE name = "given_name" AND value = "given_value"

答案 1 :(得分:0)

 SELECT data.name,data.value,record.client FROM data
 JOIN clip on clip.id = data.clip
 JOIN record ON record.id = clip.record WHERE data.name = 'name' AND data.value = 'value' ORDER BY record.date DESC LIMIT 0,1

答案 2 :(得分:0)

这是我发现的解决方案,也许它可以进行优化,但这还需要其他问题:

SELECT * FROM clip, data
WHERE data.clip=clip.id 
 AND record IN (SELECT id
  FROM record a
  WHERE date = (
    SELECT MAX(date)
    FROM record b
    WHERE a.client = b.client
    )
 )
 AND data.name='NAME_HERE' AND data.value='VALUE_HERE'