2013-05-09 4 views
0

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

db2:

id, db1id, text, count_db1 

DB1:

id, text 

db2 выше создается

SELECT *, COUNT(`db1id`) AS count_db1 FROM `db2` GROUP BY `db1id` ORDER BY count_db1 DESC 

поэтому последний столбец добавлено, и вся продукция сортируется по убыванию nt_db1.

db1ids являются идентификаторами db1. Я хочу до

SELECT * FROM db1 

упорядочено по значению count_db1 в db1. Если id db1 не существует в db2 как db1id, он должен быть добавлен в конец списка (т. Е. Присвоено значение 0 для count_db1).

пример:

db2: 
id, db1id, text, count_db1 
1,4,hello,5 
2,4,hello,5 
3,4,ho,5 
5,4,yeah,5 
6,4,no,5 
4,3,no,1 

db1: 
id, text 
3, yeahright 
4, whatever 

Таким образом, в db2 db1id 4 происходит в 5 раз, db1id 3 происходит 1 раз. Поэтому заказать записи из DB1 таким образом, что идентификатор 4 предшествует идентификатор 3. Результат должен быть:

  1. независимо
  2. yeahright

ответ

1

Простой LEFT JOIN с COUNT должны делать то, что вы хотите;

SELECT db1.* 
FROM db1 
LEFT JOIN db2 
    ON db1.id=db2.db1id 
GROUP BY db1.id, db1.text 
ORDER BY COUNT(db2.id) DESC 

An SQLfiddle to test with.

+1

вы избили меня на 10 секунд ** И ** сделали sqlfiddle! +1 – luksch

+0

Как мне создать это в следующий раз? –

+0

@ user2348735 Краткое описание; a 'db1 LEFT JOIN db2' означает, что идентификатор должен существовать в' db1', но не обязательно в 'db2'. Нормальный 'JOIN' должен был удалить все строки, которые не существуют в обоих. «GROUP BY» говорит, что вы хотите получить результат за комбинацию 'db1.id' /' db1.text' и порядки 'ORDER BY COUNT (db2.id) DESC' на количество строк в' db2', которые в каждой группе только «GROUP BY». 'DESC' означает только убывающий, от высокого до низкого. –

0

Я не тестировал это. но, возможно, он работает для вас:

SELECT db1.text FROM db1 INNER JOIN `db2` ON db2.db1id = db1.id 
GROUP BY `db1id` 
ORDER BY (COUNT(`db1id`)) DESC 

Edit: Так как вы хотите, чтобы увидеть «пустые» записи, а вы должны использовать LEFT JOIN как указывает на другие плакаты.

SELECT db1.text FROM db1 LEFT JOIN `db2` ON db2.db1id = db1.id 
GROUP BY db1.id, db1.text 
ORDER BY (COUNT(`db1id`)) DESC 
0

LEFT JOIN предпочтителен по этому делу, потому что вы все еще хотите, запись на db1 будет показан в списке, даже если id не существует на db2.db1id.

SELECT a.text 
FROM db1 a 
     LEFT JOIN db2 b 
      ON a.id = b.db1id 
GROUP BY a.id, a.text 
ORDER BY COUNT(b.db1id) DESC 

Для дальнейшего получить больше знаний о присоединяется, любезно перейдите по ссылке ниже:

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