Хитрая выборка многоязычных данных

WP

^_^
Хитрая выборка многоязычных данных

Есть таблица
CREATE TABLE `news` (
`id` int(11) unsigned NOT NULL default '0',
`aid` int(11) NOT NULL default '0',
`timestamp` int(11) default '0',
`lang` varchar(2) NOT NULL default '',
`title` varchar(100) NOT NULL default '',
`text` text NOT NULL,
FULLTEXT KEY `fulltext` (`title`,`text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='News'
Когда человек открывает страничку с новостями, он видит их список, на заданном языке, но, перевода на тот язык у новости может не быть, и в этом случае, нужно брать другой. Хотелось бы решить это на уровне запроса, а не элементарно на PHP. Возможно ли это?

Спасибо.

-~{}~ 13.07.06 09:44:

мысли следующие.. SELECT * FROM `news` GROUP BY `id` (ORDER BY `lang` == 'ru' DESC LIMIT 1) ORDER BY `id` DESC
Но одурел настолько что не соображу как это написать.
 

Romantik

TeaM PHPClub
Чегото я не пойму. У тебя есть список новостей
Id Text
у каждой подобной записи есть язык.
id lang
1 ru
2 en
3 ru
4 ru
5 de
нет никакой логики в этом так как непонятно что выводить если lang=en
Может поле aid как то влияет?
Объясни
 

WP

^_^
Romantik
aid не играет роли, это author id.
Да, есть таблица с новостями, наприер
ID, lang, text
1 ru, rus1
1 en, eng1
2 en, eng2

Человек заходит на /ru/news, и выбираем русские переводы новостей если они имеются, а если нет, на их места, вставляем их зарубежные аналоги. Т.е. юзер должен получить
1, ru, rus1
2, en, eng2
Т.к. у второй новости нет русского перевода.
 

Splurov

Новичок
Что-типа такого извращения приходит в голову:
Код:
SELECT
  IF(n2.id, n2.id, n1.id) AS id,
  IF(n2.id, n2.lang, n1.lang) AS lang
FROM news n1
  LEFT JOIN news n2 ON (n1.id=n2.parent_id AND n2.lang='en') -- текущий язык страницы
WHERE n1.parent_id=0
ORDER BY n1.id
Таблица:
Код:
CREATE TABLE  `news` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `lang` varchar(2) NOT NULL default '',
  `parent_id` int(10) unsigned NOT NULL default '0', -- id новости с которой переводили текущую, 0 если оригинал
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;
Выбираем все новости с языком по-умолчанию (parent_id=0), если для новости есть нужный нам перевод, берём его.
 

vovik

Новичок
Простейший вариант:
PHP:
SELECT
    IFNULL(news_ru.text, news_en.text)
FROM news AS news_en
    LEFT JOIN news AS news_ru ON (news_ru.id = news_en.id AND news_ru.lang = 'ru')
WHERE news_en.lang = 'en'
И совет не по теме топика. Может, стоит завести на таблице PK и индексы ?
 

WP

^_^
Splurov
Спасибо но на это пойтить я никак не могу.

-~{}~ 13.07.06 10:56:

vovik
Табличко одно.
 

Splurov

Новичок
WP
Тогда так:
[sql]SELECT
IF(n2.id, n2.id, n1.id) AS id,
IF(n2.id, n2.lang, n1.lang) AS lang
FROM news n1
LEFT JOIN news n2 ON (n1.id=n2.id AND n2.lang='ru') -- текущий язык сайта
WHERE n1.lang='en' -- основной язык сайта
ORDER BY n1.id;[/sql]
 

zarus

Хитрожопый макак
У меня такая структура:
`news` : `news_id` ...
`news_lang` : `news_id`,`lang_id` ....
Выборка такая:
Код:
SELECT *
FROM `news`
LEFT JOIN 
( SELECT * FROM `news_lang` WHERE `lang_id` IN ('en','ru') ORDER BY `lang_id` <> 'en' ) as `t1`
   ON ( `news`.`news_id` = `t1`.`news_id`)
GROUP BY `news`.`news_id`
где
'ru' - дефолтный язык,
'en' - требуемый для вывода.
[туплю]
 
Сверху