我花了最后几个小时试图找出如何生成适当的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,但它给了我这个客户端的最后一条记录对我来说足够了。
答案 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'