2016-08-04 3 views
-1


У меня есть две таблицы.
работы:
MySQL - Как получить этот результат?

+----+----------+ 
| id | position | 
+----+----------+ 
| 1 |  1 | 
| 2 |  2 | 
+----+----------+ 

содержание:

+----+---------+------+-------------+ 
| id | work_id | name | translation | 
+----+---------+------+-------------+ 
| 1 |  1 | Kot |   1 | 
| 2 |  1 | Cat |   2 | 
| 3 |  2 | Ptak |   1 | 
| 4 |  2 | Bird |   2 | 
| 5 |  2 | Ssss |   3 | 
+----+---------+------+-------------+ 

Я хочу, чтобы получить результат, как это:

+----+------+----------+ 
| id | name | sortName | 
+----+------+----------+ 
| 1 | Kot | NULL  | 
| 1 | Cat | NULL  | 
| 2 | Ptak | Ssss  | 
| 2 | Bird | Ssss  | 
+----+------+----------+ 

Мой не работает запрос здесь:

select 
    w.id, 
    c.name, 
    cSort.name as sortName 
from 
    work w 
LEFT JOIN 
    content c 
ON 
    (w.id=c.work_id) 
LEFT JOIN 
    content cSort 
ON 
    (w.id=cSort.work_id) 
WHERE 
    c.translation IN(1,2) AND 
    cSort.translation=3 
ORDER BY 
    sortName 

Я хочу получить для каждой работы хотя бы один перевод и закреплять, если существует (перевод = 1 всегда существует). И для каждой строки я хочу специальный столбец с переводом, который используется для сортировки. Но не всегда этот перевод существует для работы. В этом примере я хочу сортировать работу путем перевода = 3.

Извините за мой беглый английский. Есть идеи?

С наилучшими пожеланиями

+0

Что касается «Мой не работает запрос»: вы всегда должны сказать нам, что * * не работает. Например: «Запрос показывает другие типы сортировки, чем ожидалось, и не сортирует результаты по work.position». (Объяснение также поможет вам снова рассмотреть вопросы, и вы, вероятно, заметите, почему результаты не упорядочены по work.position.) –

+0

это абсурдная модель данных –

ответ

0

Так translation также work_id и вы считаете translation = 3 перевода в вашем примере и translation <> 3 оригинала. Вы хотите присоединиться к каждой оригинальной записи с каждой записью перевода, в которой последний work_id соответствует первому translation.

Я думаю, вы просто вводите в заблуждение идентификаторы здесь. Он должен быть ON (w.translation = cSort.work_id).

Другой способ написать запрос:

select o.work_id as id, o.name, t.name as sortname 
from (select * from content where translation <> 3) o 
left join (select * from content where translation = 3) t 
    on t.work_id = o.translation 
order by t.name; 

Там, кажется, нет никакой необходимости, чтобы присоединиться к таблице work.

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

UPDATE: Чтобы отсортировать результаты по work.position, вы можете присоединиться к этой таблице или использовать подзапрос. Вот статья order by для последнего:

order by (select position from work w where w.id = o.work_id); 
+0

Это работает, но я получаю неправильный результат. Заказ важен. Посмотрите на мое сообщение, что я, кроме как получить. С вашим запросом я получаю: id 2 | id 1 | id 1 | id 2. – Korneliusz7

+0

Хорошо, тогда возникает вопрос, почему вы заказываете сортировку в своем запросе, когда не хотите, чтобы ваши данные упорядочивались по имени сортировки. Я просто взял это из вашего запроса.Вы даже не объясняете, по каким критериям вы хотите, чтобы ваши данные были заказаны. Вероятно, это «позиция» из рабочего стола? Я уточню свой ответ. –

0
/* 
create table work (id int, position int); 
insert into work values 
( 1 ,  1), 
( 2 ,  2); 

create table content(id int, work_id int, name varchar(4), translation int); 
insert into content values 
( 1 ,  1 , 'Kot' ,   1), 
( 2 ,  1 , 'Cat' ,   2), 
( 3 ,  2 , 'Ptak' ,   1), 
( 4 ,  2 , 'Bird' ,   2), 
( 5 ,  2 , 'Ssss' ,   3); 
*/ 
select w.id,c.name,(select c.name from content c where c.work_id = w.id and c.translation = 3) sortname 
from  work w 
join  content c on w.id = c.work_id 
where  c.translation <> 3; 

результат

+------+------+----------+ 
| id | name | sortname | 
+------+------+----------+ 
| 1 | Kot | NULL  | 
| 1 | Cat | NULL  | 
| 2 | Ptak | Ssss  | 
| 2 | Bird | Ssss  | 
+------+------+----------+ 
Смежные вопросы