我花了几个小时试图找出如何生成适当的 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,
)
我尽可能地减少了表格。 record表包含客户端数据,然后clip用于将该客户端与存储在data中的一些客户端参数连接起来。每个客户端可以拥有任意数量的记录,并且每条记录都由不确定数量的*剪辑*组成。然后,每个剪辑引用一些数据值。
好的,我正在寻找的查询是给定一个工作表、一个数据 *名称*和一个值的查询最后(日期)*客户端*完成条件名称=*given_name* AND 值=*given_value*。是的,我正在寻找在数据库中存储的最后一条记录中实现该条件的客户端。
我已经看到这句话了:
SELECT client
FROM clip, record
WHERE clip.id IN (SELECT clip FROM `data` WHERE name='level' AND value='2')
但它返回所有客户端,而不仅仅是最后一个客户端,并且我的所有测试(包括日期)均不成功。
编辑:经过一些尝试和错误,并感谢你给我的想法,我得到了一个似乎有效的查询,但它确实很复杂,我很当然你可以帮助我简化:
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,但它为我提供了该客户端的最后记录,这对我来说已经足够了。
最佳答案
如果我正确理解了您的问题,那么看看这是否适合您:
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"
关于mysql - 在一个查询中连接 3 个 mySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7695952/