Считая первую букву названия и печатные буквы от A до Z


Я пытаюсь считать названия по первой букве и фильтровать его тег.

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

Вот ссылка sqlfiddle: http://sqlfiddle.com/#!9/3155cd/2

Мой запрос:

SELECT letter.letter as firstLetter, COUNT(item_tag.id) AS itemCount
        FROM letter
        left outer join item
             on left(item.title, 1) = letter.letter
        left outer join item_tag
            ON item_tag.item_id = item.id
        AND item_tag.tag_id = 1
        GROUP BY letter.letter

Вот мои таблицы:

Пункт:

+----+-----------------+
| id |      title      |
+----+-----------------+
|  1 | title goes here |
+----+-----------------+

тег:

+----+----------+
| id |   name   |
+----+----------+
|  1 | tag name |
+----+----------+

item_tag

+----+--------+---------+
| id | tag_id | item_id |
+----+--------+---------+
|  1 |      1 |       1 |
+----+--------+---------+

письмо:

+----+--------+
| id | letter |
+----+--------+
| 1  | A      |
| 2  | B      |
| .  | .      |
+----+--------+


137
0
задан 31 января 2018 в 10:01 Источник Поделиться
Комментарии
1 ответ

Скрипка сейчас опять сломался, но вы должны сделать графу как можно -> раннее внутренний вместо более дорогого внешнего соединения и менее строк, чтобы присоединиться.

SELECT l.letter AS firstLetter
-- return 0 for missing letters
,Coalesce(lc.cnt,0) AS itemCount
FROM letter AS l
LEFT OUTER JOIN
( -- count letters before join
SELECT Left(i.Title,1) AS letter
,Count(*) AS cnt
FROM item AS i -- no Outer Join needed
JOIN item_tag AS it
ON it.item_id = i.id
AND it.tag_id = 1
GROUP BY Left(i.Title,1)
) AS lc
ON lc.letter = l.letter

0
ответ дан 31 января 2018 в 07:01 Источник Поделиться