упорядочение таблицы в Mysql, по другой, но не видя повторяющихся строк первой таблицы - PullRequest
1 голос
/ 17 апреля 2009

В MySql у меня есть две таблицы, A и B.

A имеет столбцы A.id, B имеет столбцы B.id и B.aid.

или в каждом ряду A у меня есть много рядов B. И значение B.aid = A.id

конечно.

Теперь мне нужно получить список значений в A, но мне нужно упорядочить их в соответствии с B.

В частности, если у меня есть две строки в A: a1 и a2. Каждый будет иметь ряд строк в B: B11, B12, B13, ... а также b21, b22, b23, ... Теперь мне нужно заказать A от того, который связан с самым высоким b.id до того, который имеет второе самое высокое, и так далее. (конечно, одна строка появляется только один раз).

Я пробовал это:

SELECT a.id  FROM a, b WHERE a.id=b.aib ORDER BY b.id DESC 

Я действительно получил все значения в правильном порядке, но каждое значение A появилось бы n раз, если n было числом строк в B, связанных с этой строкой в ​​A.

Как мне избежать этого, чтобы получить только одно значение.

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

(Если вам интересно, это для программирования факсимиле доски обсуждений, таблица A - это нить, а таблица B - запись, и я хочу, чтобы была страница, на которой представлены все темы. , но в порядке потока, который выполнил последнее действие позже)

Большое спасибо, Pietro

P.S. MySql - не моя вещь, поэтому, пожалуйста, изложите решение :))

UPDATE: Фактический код является более сложным, поскольку он также включает пользователей и тому подобное. Итак, я смотрю на что-то вроде:

SELECT DISTINCT a.id, a.question, a.roundid, a.phase, users.username, users.id  
FROM a, users, b 
WHERE a.phase = 0 AND users.id = a.usercreatorid AND b.experimentid = a.id 
ORDER BY b.id DESC

Я попробовал DISTINCT, как предложено ниже, но он не работает. Я получаю все темы (то есть вопросы) уникально, но они не совсем упорядочены. Я не знаю почему, но кажется, что он не выбирает случайную строку из b, и это обычно идет в правильном направлении, но это не строка с максимумом (b.id). ТАК отличное не сортирует между рядами правильным способом. Теперь я посмотрю на другие предложенные решения.

Ответы [ 3 ]

2 голосов
/ 17 апреля 2009
select * from parent a 
order by ( select max(id) from child b where b.parent_id = a.id);

NOTE WELL: это не объединение, поэтому вы получите все строки в a, а не только те, у которых есть дочерний элемент в b.

Вы можете понять, почему, если вы делаете это:

select *, ( select max(id) from child b where b.parent_id = a.id)
from parent a 
order by ( select max(id) from child b where b.parent_id = a.id);

(нулевая сортировка перед чем-либо еще в возрастающей сортировке.)

Это позволяет избежать group ввода или distinct ввода и имеет то преимущество, что SQL довольно четко определяет ваши намерения, а не обходной путь для достижения ваших намерений, что делает его более комментируемым, чем некоторые альтернативы. *

1 голос
/ 17 апреля 2009

Вы хотите использовать ключевое слово DISTINCT.

SELECT DISTINCT a.id  FROM a, b WHERE a.id=b.aib ORDER BY b.id DESC
1 голос
/ 17 апреля 2009

Насколько я понимаю, вам нужны значения a.id, упорядоченные по последнему соответствующему значению b.id.

Если у вас есть отношение 1-> много и вам нужна такая информация, вы обычно обращаетесь к GROUP BY для агрегирования данных или к подзапросу для более сложных критериев.

Итак, что-то вроде этого должно сделать это, используя группу:

SELECT 
   a.id, a.question, a.roundid, a.phase, 
   users.username, users.id, 
   MAX(b.id) AS latest 
FROM 
   a, users, b 
WHERE 
   a.phase = 0 AND users.id = a.usercreatorid AND b.experimentid = a.id 
GROUP BY a.id
ORDER BY latest DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...