Свяжите несколько полей в одно с SQL

Вы регистрируетесь как доверенный пользователь (по умолчанию) - и этот пользователь является пользователем пула IIS APPPOOL \ DefaultAppPool, вам нужно либо войти в систему, либо вы в качестве логина SQL. Поскольку он не использует одни и те же учетные данные при запуске под пулом, как это делается с вашего рабочего стола.

5
задан Nhan 2 December 2016 в 09:20
поделиться

6 ответов

Sergio Дель Амо:

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

SELECT pagetag.id, page.name, group_concat(tag.name)
FROM
(
    page LEFT JOIN pagetag ON page.id = pagetag.pageid
)
LEFT JOIN tag ON pagetag.tagid = tag.id
GROUP BY page.id;

Не очень симпатичный запрос, но должен дать Вам, что Вы хотите - pagetag.id и group_concat(tag.name) будет null для страницы 4 в примере Вы отправили выше, но страница должна появиться в результатах.

3
ответ дан 14 December 2019 в 04:51
поделиться

Да, можно сделать это через 3 что-то как ниже:

SELECT page_tag.id, page.name, group_concat(tags.name)
FROM tag, page, page_tag
WHERE page_tag.page_id = page.page_id AND page_tag.tag_id = tag.id;

Не был протестирован, и мог быть, вероятно, быть записанным немного более эффективно, но должны запустить Вас!

Кроме того, MySQL принят, так может не играть настолько любезный с MSSQL! И MySQL не дик о дефисах в именах полей, так изменивших на символы нижнего подчеркивания в вышеупомянутых примерах.

3
ответ дан 14 December 2019 в 04:51
поделиться

Насколько я - осведомленный SQL92, не определяет, как конкатенация строк должна быть сделана. Это означает, что большинство механизмов имеет свой собственный метод.

Если Вы хотите базу данных независимый метод, необходимо будет сделать это за пределами базы данных.

(непротестированный во всех кроме Oracle)

Oracle

SELECT field1 | ', ' | field2
FROM table;

MS SQL

SELECT field1 + ', ' + field2
FROM table;

MySQL

SELECT concat(field1,', ',field2)
FROM table;

PostgeSQL

SELECT field1 || ', ' || field2
FROM table;
1
ответ дан 14 December 2019 в 04:51
поделиться

Я получил решение, играющее с соединениями. Запрос:

SELECT
    page.id AS id,
    page.name AS name,
    tagstable.tags AS tags
FROM page 
LEFT OUTER JOIN 
(
    SELECT pagetag.pageid, GROUP_CONCAT(distinct tag.name) AS tags
    FROM tag INNER JOIN pagetag ON tagid = tag.id
    GROUP BY pagetag.pageid
)
AS tagstable ON tagstable.pageid = page.id
GROUP BY page.id

И это будет выводом:

id   name    tags
---------------------------
1    page 1  tag2,tag3,tag1
2    page 2  tag1,tag3
3    page 3  tag4
4    page 4  NULL

Действительно ли возможно повысить скорость запроса, пишущий это иначе?

1
ответ дан 14 December 2019 в 04:51
поделиться

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

Что-то как (не протестированный):

select ID as 'PageId', Name as 'PageName', null as 'Tags'
into #temp 
from [PageTable]

declare @lastOp int
set @lastOp = 1

while @lastOp > 0
begin
    update p
    set p.tags = isnull(tags + ', ', '' ) + t.[Tagid]
    from #temp p
        inner join [TagTable] t
            on p.[PageId] = t.[PageId]
    where p.tags not like '%' + t.[Tagid] + '%'

    set  @lastOp == @@rowcount
end

select * from #temp

Ужасный все же.

T-SQL того примера, но я думаю, что MySql имеет эквиваленты всему используемому.

0
ответ дан 14 December 2019 в 04:51
поделиться

pagetag.id и group_concat (tag.name) будут пустыми для страницы 4 в примере, который Вы отправили выше, но страница должна появиться в результатах.

Можно использовать COALESCE функция для удаления Пустых указателей, если Вы должны:

select COALESCE(pagetag.id, '') AS id ...

Это возвратит первое ненулевое значение из, он - список параметров.

0
ответ дан 14 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: