Объединить 3 таблицы MySQL в одном запросе - PullRequest
0 голосов
/ 08 октября 2011

Последние часы я пытался выяснить, как сгенерировать подходящий запрос 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 . Каждый клиент может иметь столько записей , сколько ему нужно, и каждая запись состоит из неопределенного числа * клипов * s. Затем каждый клип ссылается на некоторые данные значения.

Хорошо, запрос, который я ищу, это тот, который дал лист , data * name * и 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'

Ну, это не совсем то, что я хочу, мне нужен идентификатор клиента, но он дает мне последнюю запись для этого клиента, которой мне достаточно.

Ответы [ 3 ]

1 голос
/ 08 октября 2011

Если я правильно понял ваш вопрос, то посмотрите, работает ли он для вас:

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"
0 голосов
/ 09 октября 2011

Это решение, которое я нашел, возможно, его можно оптимизировать, но для этого нужен другой вопрос:

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'
0 голосов
/ 08 октября 2011
 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...