Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyciągnąć rekord ID=1 lub ID=2 jeżeli ID=1 jest puste
Forum PHP.pl > Forum > Bazy danych > MySQL
Wave
Czy jest prostsza metoda niż:
  1. SELECT IFNULL(b.value, a.value) AS value
  2. FROM table1 AS a
  3. LEFT JOIN table1 AS b ON b.id=1 AND b.value != ""
  4. WHERE a.id=2
?

Jeżeli rekord o id=1 jest pusty to wyciągam rekord o id=2.

Zastosowanie:
Wyciąganie tłumaczeń tekstów (jeżeli nie mamy tekstu po polsku w bazie to wyciągamy angielską wersję).
adk11
dobrze by było jakbyś podał kilka przykładowych rekordów z tej tabeli, bo dziwnie złączyłeś te tabelę samą z sobą
Wave
Oj, no na przykład coś takiego:

ID - VALUE - PARAM
1 - "polski" - "text"
2 - "english" - "text"

  1. SELECT IFNULL(b.value, a.value) AS value
  2. FROM table1 AS a
  3. LEFT JOIN table1 AS b ON b.param=a.param AND b.id=1 AND b.value != ""
  4. WHERE a.id=2


Zwróci: "polski"

natomiast dla:
ID - VALUE - PARAM
1 - "" - "text"
2 - "english" - "text"

Zwróci "english".

Są łatwiejsze metody?
adk11
Ja bym widział inaczej zbudowaną te tabelę.

CREATE TABLE `table1` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`VALUE` text,
`PARAM` text,
`LANG` enum('pl','en') DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

ID VALUE PARAM LANG
1 null window pl
2 window window en

wtedy szukając jakiegoś słówka używamy

SELECT IFNULL(a.`VALUE`, b.`VALUE`) AS value
FROM table1 AS a
LEFT JOIN table1 AS b ON a.`PARAM`=b.`PARAM`
WHERE a.`LANG`='pl' and b.`LANG` = 'en' and b.`PARAM`='window'

dużo można wymyślać ale to zależy od wielu czynników.


btw. zmieniłeś zapytanie dry.gif
Wave
Nie bierzesz pod uwagę, że polskiego tłumaczenia może nie być w bazie w ogóle (albo może mieć wartość ""), a poza tym to wiele nie wniosłeś. Zapytanie było poglądowe.
Cytat
dużo można wymyślać ale to zależy od wielu czynników.

Czynnik przedstawiłem w 1 poście: najprostsza metoda. Słucham zatem.

Myślałem też o podzapytaniach albo odpowiednim grupowaniu z użyciem having. Ostatecznie zostaje sprawdzanie w PHP i rozbicie na dwa co będzie chyba ciężkie przy dużej ilości zapytań.
adk11
Przepraszam, nie doczytałem pierwszego posta.

Mówiąc o czynnikach miałem na myśli.
1. będzie więcej niż 2 języki
2. jak dużo będzie rekordów
3. jak często będzie szukane tłumaczenie
4. czy wchodzi w grę przeróbka tabeli

Jeżeli nie chcesz przerabiać tabeli i ogólnie pytanie było czy przy obecnej strukturze da się łatwiej uzyskać wynik to ja raczej nie widzę inaczej i dołączanie kompletnych tłumaczeń polskich z prawej strony jest wg mnie ok.

pozdrawiam
Pilsener
Przy tak skonstruowanej tabeli nie ma, wydajność będzie zawsze problematyczna ze względu na dużą redundancję (dużo pustych pól gdy dla danego języka nie będzie tłumaczenia) oraz na fakt, że operujemy tylko na części tabeli (nie potrzebujemy wszystkich języków na raz). Jeśli robisz to w bazie to ja bym polecał tabelę podstawową z frazami po angielsku + dodatkowa tabela dla każdego innego języka dołączana left joinem w której będą znajdować się tylko przetłumaczone frazy, oczywiście to, którą tabelę dołączamy zależy od usera.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.