2014-12-29 4 views
0

Я искал решение в течение нескольких дней, и я начинаю чувствовать себя настоящим идиотом.Выбор из двух таблиц, ограничение на первое

У меня есть две таблицы.

entries      link 
+----------+-------+-----+ +----------+------+ 
| date  | title | txt | | date  | tag | 
+==========+=======+=====+ +==========+======+ 
|2014-01-01| titl1 | txt1| |2014-01-01| tag1 | 
|2014-01-02| titl2 | txt2| |2014-01-01| tag2 | 
|2014-01-03| titl3 | txt3| |2014-01-01| tag3 | 
|2014-01-04| titl4 | txt4| |2014-01-02| tag1 | 
|2014-01-05| titl4 | txt4| |2014-01-02| tag2 | 
|2014-01-06| titl4 | txt4| |2014-01-03| tag1 | 
|2014-01-07| titl4 | txt4| |2014-01-04| tag2 | 
|2014-01-08| titl4 | txt4| |2014-01-04| tag4 | 
+----------+-------+-----+ +~~~~~~~~~~+~~~~~~+ 'link' continues 

Я хочу * от «записей», упорядоченных по дате «», ограниченных 4, а также все соответствующие «тега из„ссылки“для каждой записи.

«дата» из «записей» является первичным ключом, если это важно. «link» не имеет первичных ключей, так как будут дубликаты «даты» и «тега».

Публикация здесь была последней инстанцией, поскольку я вообще ненавижу полагаться на помощь, чтобы что-то сделать, но я полностью исчерпал умственную способность продолжать попытки.

У меня есть этот запрос, который захватывает одну запись и соответствующий тег и ограничивает число на 4, но он не захватывает/все/теги для каждой записи.

SELECT date, title, txt 
FROM entries 
WHERE date IN (
    SELECT date 
    FROM link 
    WHERE date = entries.date 
) 
LIMIT 4 

Если я 'реверс' это и попробовать,

SELECT date, tag 
FROM link 
WHERE date IN (
    SELECT date 
    FROM entries 
    WHERE date = link.date 
) 
LIMIT 4 

Это ограничивает четыре строки из 'ссылки'.

Надеюсь, я объяснил, что я хочу правильно. Если бы я был неясен, я могу попробовать еще раз.

+0

Проблема теперь, если на примере '2014-01-01' имеется 3 связанных элемента в таблице' link'. В запросе JOIN, который объединяет данные из обеих таблиц, это приведет к 3 записям. SOo, вы хотите, чтобы три тега с 2014-01-01 и первый тег от 2014-01-02 в вашем лимите 4 или вы пытаетесь ограничить диапазон дат для записей и получить все теги для каждого из 4 даты (что потребует некоторой агрегации)? –

+0

Все теги для каждой из четырех записей. Я отредактирую главный пост, чтобы это отразить. – TanzNukeTerror

ответ

0

я получил то, что я хотел с,

SELECT * 
FROM (
    SELECT date AS date 
    FROM entries 
    ORDER BY date DESC 
    LIMIT 4 
) AS ent, link 
WHERE ent.date = link.date 

Это дает мне записи и всем своим тег и пределы четырех записей, не разрезая тег прочь.

Он выводит узор, подобный:

2014-01-04 tag4 
2014-01-04 tag2 
2014-01-03 tag1 
2014-01-02 tag2 
2014-01-02 tag1 
2014-01-01 tag3 
2014-01-01 tag2 
2014-01-01 tag1 

Что я и хотел.

Я потратил несколько часов, чтобы просто успокоиться и просто уйти от кода, а иногда это все, что вам нужно.

0

Не уверен, что именно вы спрашиваете. Этот запрос возвращает первые четыре записи и связанные с ними теги

select a.date, a.title, a.txt , l.tag 
from 
(select date, title, txt 
from entries 
limit 4) a, 
link l 
where l.date = a.date 

Не уверен, что ROWNUM (оракул) в MySQL, предполагаю, что это предел зависит от вашего поста.

0

Следующий запрос даст вам максимум 4 даты (в порядке возрастания) со всеми связанными тегами, связанными с разделителями, разделенными запятыми, в вычисленном поле tags. Разумеется, не отображается условие WHERE (я не видел значимого ГДЕ в вашем вопросе), поэтому, я думаю, вы хотели бы добавить его, чтобы сделать это значимым (т. Е. Не возвращать первые 4 даты каждый раз). Также неясно, какой порядок сортировки вы хотели использовать. Как правило, плохая форма заключается в использовании LIMIT без соответствующего предложения ORDER BY, так как вы можете получить неожиданные результаты. Я предполагал восходящую сортировку, основанную на дате здесь.

SELECT 
    e.`date` AS `date`, 
    e.title AS title, 
    e.txt AS txt, 
    GROUP_CONTAT(l.tag) AS tags 
FROM entries AS e 
LEFT JOIN link AS l 
    ON e.`date` = l.`date` 
ORDER BY e.`date` ASC 
WHERE ??? 
LIMIT 4 

Примечание: Используйте INNER JOIN вместо LEFT JOIN, если вы хотите только entries записи, которые имеют некоторые связанные записи в link. Вы также можете рассмотреть возможность использования строки, отличной от зарезервированного слова date, для имен ваших столбцов.

Смежные вопросы