ďťż

[PHP & mySQL] Dwa zapytania SELECT złączone Jak poznać który rekord z której tabeli jest?

       

Podstrony


telcocafe

Mam zapytanie:
$query = ' SELECT `id`, `title`, `text` FROM `'.prefix.'articles` WHERE `title` LIKE "%'.$word.'%" OR `text` LIKE "%'.$word.'%" UNION SELECT `id`, `title`, `text` FROM `'.prefix.'news` WHERE `title` LIKE "%'.$word.'%" OR `text` LIKE "%'.$word.'%" LIMIT '.$start.', '.$limit.'';
Nie wiem natomiast jak w pętli while rozpoznać który rekord z której tabeli został pobrany, ponieważ chciałbym zrobić coś takiego:
Jeśli rekord jest z tabeli newsów to zmienna $type = 'News' a zmienna $filename = 'news', analogicznie dla artykułów (skrypt wyszukiwarki). Jest jakiś inny sposób niż dodanie do tabelek kolumienek "type" i umieszczenie tam literek N i A?
Użytkownik Isaac from Vale edytował ten post 13 sierpień 2007, 12:13


Może:
SELECT `id` as id_articles, `title` as title_articles, `text` as text_articles FROM `'.prefix.'articles`
i analogicznie do tabelki news

To jest moja pętla:
while($record = mysql_fetch_array($result)) { $record['title'] = str_ireplace($word, '<b>'.$word.'</b>', strip_tags($record['title'])); $record['text'] = str_ireplace($word, '<b>'.$word.'</b>', substr(strip_tags($record['text']), 0, 200).'...'); if(warunek) { $type = 'News'; $filename = 'news'; } elseif(warunek) { $type = 'Artykuł'; $filename = 'article'; } echo '<hr size=1>'; echo '<b>'.$type.':</b><br>'; echo $record['title']; echo "<br>"; echo $record['text']; echo '<a href="../'.$filename.'.php?id='.$record['id'].' ">[Wiecej]</a>'; }

Jeśli nie zrobiłem literówki powinno działać:
$query = ' SELECT `id` as id_article, `title`, `text` FROM `'.prefix.'articles` WHERE `title` LIKE "%'.$word.'%" OR `text` LIKE "%'.$word.'%" UNION SELECT `id` as id_news, `title`, `text` FROM `'.prefix.'news` WHERE `title` LIKE "%'.$word.'%" OR `text` LIKE "%'.$word.'%" LIMIT '.$start.', '.$limit.''; $result=mysql_query($query); while($record = mysql_fetch_array($result)) { $record['title'] = str_ireplace($word, '<b>'.$word.'</b>', strip_tags($record['title'])); $record['text'] = str_ireplace($word, '<b>'.$word.'</b>', substr(strip_tags($record['text']), 0, 200).'...'); if(isset($record['id_news'])) { $type = 'News'; $filename = 'news'; $id=$record['id_news']; } elseif(isset($record['id_article'])) { $type = 'Artykuł'; $filename = 'article'; $id=$record['id_article']; } echo '<hr size=1>'; echo '<b>'.$type.':</b><br>'; echo $record['title']; echo "<br>"; echo $record['text']; echo '<a href="../'.$filename.'.php?id='.$id.'">[Wiecej] </a>'; }
@EDIT:
literówka ;]
Użytkownik kutar edytował ten post 13 sierpień 2007, 13:17


Błąd: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\Programy\VertrigoServ\www\search.php on line 101
Patrząc na Twoją pętle... skoro te id są brane i z newsów i z artykułów to i tak będą istnieć. ;] Więc jakby zadziałało to chyba wszędzie będzie News.
Użytkownik Isaac from Vale edytował ten post 13 sierpień 2007, 13:40
Błąd w zapytaniu, skopiowalem to co zamieściłeś i tylko po 'id' dałem "as ...". No więc jakaś literówka.

A co do rozwiązania.
Nie znam struktury Twojej bazy i tego co chcesz osiągnąć, ale myślę, że rozwiązać mozna by tak, że:
elseif(isset($record['id_article'])) {
zmienimy na:
if(isset($record['id_article'])) {
wtedy odpowiednie dane z odpowiednich tabel trafią do "swoich" warunków.
Tylko że wtedy musiałbyś wszystkim polom w obu zapytaniach dać
'nazwapola' as 'nazwapola_nazwatabeli'
no i odwoływać się do nich w warunku.

Mniej więcej chodzi mi o coś takiego:
$result=mysql_query($query); while($record = mysql_fetch_array($result)) { if(isset($record['id_news'])) echo '<hr size=1><b>News:</b><br>'.str_ireplace($word, '<b>'.$word.'</b>', strip_tags($record['title_news'])).'<br>'.str_ireplace( $word, '<b>'.$word.'</b>', substr(strip_tags($record['text_news']), 0, 200).'...').'<a href="../news.php?id='.$record['id_news'].'">[Wiecej] </a>'; if(isset($record['id_article'])) echo '<hr size=1><b>Artykuł:</b><br>'.str_ireplace($word, '<b>'.$word.'</b>', strip_tags($record['title_article'])).'<br>'.str_ireplace( $word, '<b>'.$word.'</b>', substr(strip_tags($record['text_article']), 0, 200).'...').'<a href="../article.php?id='.$record['id_article'].'">[ Wiecej]</a>'; }
trochę nieczytelnie to wyszło, ale chciałem ująć w "jedno miejsce" to co dotyczy newsów a w drugie artykułów.

Zrobiłem jak napisałes, nie działa :D

Nie działa to znaczy co? Jakiś błąd wywala?

Możesz też rozdzielić na 2 zapytania do bazy i najpierw wykonać jedno, wyświetlić wyniki, a potem drugie.

Nie działa, artykuły artykułami, newsy artykułami. Co do drugiej myśli: http://forum.ks-eksp...howtopic=108546


Nie działa, artykuły artykułami, newsy artykułami.
Hmmm... być może, że coś pokiełbasiłeś w zapytaniu i "nazwa AS tabelka_nazwa". Pokaż to całe zapytanie, jakiego użyłeś.

Co do drugiej myśli: http://forum.ks-eksp...howtopic=108546
OK ;] W sumie widziałem ten topic, ale teraz jakoś zapomniałem o nim :)

Masz:
#------------ zapytanie dla wszystkich tabel ------------# if($_POST['type']=='all' OR $_GET['where']=='all') { $query = ' SELECT `id` AS a_id, `title` AS a_title, `text` AS a_text FROM `'.prefix.'articles` WHERE `title` LIKE "%'.$word.'%" OR `text` LIKE "%'.$word.'%" UNION SELECT `id` AS n_id, `title` AS n_title, `text` AS n_text FROM `'.prefix.'news` WHERE `title` LIKE "%'.$word.'%" OR `text` LIKE "%'.$word.'%" LIMIT '.$start.', '.$limit.''; } # Wyświetlenie wyników $result = mysql_query($query); while($record = mysql_fetch_array($result)) { if(isset($record['a_id'])) { $record['a_title'] = str_ireplace($word, '<b>'.$word.'</b>', strip_tags($record['a_title'])); $record['a_text'] = str_ireplace($word, '<b>'.$word.'</b>', substr(strip_tags($record['a_ext']), 0, 200).'...'); $type = 'Artykul'; $filename = 'article'; echo '<hr size=1>'; echo '<b>'.$type.':</b><br>'; echo $record['a_title']; echo "<br>"; echo $record['a_text']; echo '<a href="../'.$filename.'.php?id='.$record['a_id'].' ">[Wiecej]</a>'; } if(isset($record['n_id'])) { $record['n_title'] = str_ireplace($word, '<b>'.$word.'</b>', strip_tags($record['n_title'])); $record['n_text'] = str_ireplace($word, '<b>'.$word.'</b>', substr(strip_tags($record['n_text']), 0, 200).'...'); $type = 'News'; $filename = 'news'; echo '<hr size=1>'; echo '<b>'.$type.':</b><br>'; echo $record['n_title']; echo "<br>"; echo $record['n_text']; echo '<a href="../'.$filename.'.php?id='.$record['n_id'].' ">[Wiecej]</a>'; } }
IMHO źle myślisz. Przecież stosując Twoją instrukcję warunkową to się nigdy nie osiagnie zamierzonego efektu. Przecież jak hurtem bierze, to zawsze ta zmienna będzie istnieć.
Użytkownik Isaac from Vale edytował ten post 13 sierpień 2007, 15:33
prosty przykład:

SELECT title, "jeden" FROM content UNION SELECT title, "dwa" FROM content;

Bełdzio, o co chodzi z tym zapytaniem, wytłumaczysz? :D

SELECT 'art', `id`, `title`, `text` FROM `'.prefix.'articles` WHERE `title` LIKE "%'.$word.'%" OR `text` LIKE "%'.$word.'%" UNION SELECT 'news', `id`, `title`, `text` FROM `'.prefix.'news` WHERE `title` LIKE "%'.$word.'%" OR `text` LIKE "%'.$word.'%" LIMIT '.$start.', '.$limit.'
zobacz jak to działa to będziesz wiedział

Wkleiłem do skryptu. Nie widzę żadnych szczególnych funkcji Twojego zapytania. Mógłbys wyjaśnić o co w nim chodzi? :)

http://www.imagehost...1032166_sql.jpg może być?

Jasne, dzięki :) Bardzo mi pomogłeś, dzięki :) Teraz już wszystk ogra bez dodatkowych pól w tabeli :D

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.