SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.10.2011 23:45:53

Igor29
Участник
Зарегистрирован: 11.10.2011
Сообщений: 3

Проблема с запросом

Доброго времени суток, ув. форумчане smile
Сейчас изложу суть проблемы.
Есть таблица №1:

`keys`

id | keyword | google | yandex
--------------------------------
1 | париж    | 10      | 20
--------------------------------
2 | техника  | 15      | 30

Есть таблица №2:

post

id |    title         | skeys
------------------------
1 | Заголовок    | 1, 2

Задача заключается в составлении запроса, который бы брал каждую запись из post и прикреплял к ней суммарное значение google и yandex записей 1, 2 (post.skeys) из таблицы keys.

Пробовал так:


  SELECT p.id, title, SUM(k.google) google, SUM(k.yandex) yandex FROM post p
  LEFT JOIN `keys` k ON k.id IN (p.skeys)
 


Ошибки нет, но оно выбирает только первую запись (тобишь с id = 1 )

Пробовал в IN вписать подзапрос SELECT, тоже самое...

Если написать запрос так:


  SELECT p.id, title, SUM(k.google) google, SUM(k.yandex) yandex FROM post p
  LEFT JOIN `keys` k ON k.id IN (1, 2)
 


То все работает корректно, но значение "1,2" нужно брать из поля p.skeys
Спасибо!

Отредактированно Igor29 (11.10.2011 23:47:38)

Неактивен

 

#2 11.10.2011 23:58:32

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Проблема с запросом

Вероятно поможет
IN concat(''',p.skeys,''') или IN concat('\'',p.skeys,'\'')
вместо
IN (p.skeys)

А вообще не стоит через запятую эти skeys хранить - лучше создайте отношение многие ко многим wink.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 12.10.2011 00:15:57

Igor29
Участник
Зарегистрирован: 11.10.2011
Сообщений: 3

Re: Проблема с запросом

Если написать так:

IN concat(''',p.skeys,''')

или
IN concat('\'',p.skeys,'\'')

Вызывает ошибку синтаксиса, потому что после IN нету скобок " IN() "
Если конкатизацию занести в IN(CONCAT(...)) то Google и Yandex будет NULL

Возможно ли реализовать это с запятыми?
Если нет, не могли бы вы помочь организовать это отношение?

Неактивен

 

#4 12.10.2011 00:43:39

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Проблема с запросом

Можно так:

SELECT p.id, title, SUM(k.google) google, SUM(k.yandex) yandex FROM post p LEFT JOIN keys k on CONCAT(',',p.skeys,',') LIKE CONCAT('%,',k.id,',%');


Но никогда так не делайте!, это плохой костыль.

Отношение многие ко многим в данном случае выглядело бы так: таблица с двумя полями - post_id и skey.
В случае Ваших данных были бы такие записи:
post_id    skey
1            1
1            2

После создания такой таблицы столбец skeys из таблицы post стираете.

Отредактированно deadka (12.10.2011 00:43:56)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 12.10.2011 00:55:16

Igor29
Участник
Зарегистрирован: 11.10.2011
Сообщений: 3

Re: Проблема с запросом

Спасибо за помощь и за хороший совет, действительно в таких ситуациях следующий раз буду пользоваться отношением многих ко многим.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson