Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] Tag Cloud, Jak zrobic zapytanie z 4 kolumn, aby sumowało w "chmurce"
palixmp
post 16.12.2008, 22:20:58
Post #1





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 19.07.2006

Ostrzeżenie: (0%)
-----


Potrzebował bym pomocy w zapytniu SQL. Zrobiłem Tag Cloud (z tutka: http://prism-perfect.net/archive/php-tag-cloud-tutorial/) i wszystko ładnie śmiga, ale tylko umiem zrobic to dla jednej kolumny, a mianowicie:

  1. <?php
  2. $query = "SELECT Tag1 AS tag,COUNT(*) AS quantity
  3. FROM `LINKI`
  4. GROUP BY Tag1";
  5. ?>


a na stronce mam możliwośc wpisania 4 tagów, są kolumny Tag1, Tag2, Tag3, Tag4, no i wiadomo, jak to działa, chodzi mi o to jak połączyc wyniki z tych 4 kolumn?? Wymyśliłem coś takiego:

  1. SELECT `Tag1`,
  2. COUNT(*) AS ILERAZY
  3. FROM `LINKI` GROUP BY Tag1
  4. UNION
  5. SELECT `Tag2`,
  6. COUNT(*) AS ILERAZY
  7. FROM `LINKI` GROUP BY Tag2
  8. UNION
  9. SELECT `Tag3`,
  10. COUNT(*) AS ILERAZY
  11. FROM `LINKI` GROUP BY Tag3 ;


Ale to mi powtarza i np w jednej "chmurce" mam 3 razy to samo słowo:(

Pomógł by ktoś z rozwiązaniu tego?? Z gory dzięki!!

P.S.
Co myślicie o tym rozwiązaniu Tag Cloud co dałem link do tego tutka? Jest godny wykorzytania, czy polecacie coś innego?
Go to the top of the page
+Quote Post
marcio
post 16.12.2008, 22:24:27
Post #2





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Musisz uzyc albo In() z selectem w srodku alb Left Join z relacjami miedzy kolumnami tak mi wydaje linku nie ogladalem


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
palixmp
post 16.12.2008, 23:01:46
Post #3





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 19.07.2006

Ostrzeżenie: (0%)
-----


A dałby ktoś jakąś konkretniejszą odpowiedz? Bo przyznam sie bez bicia, że nie wiem jak to zrobic sad.gif
Go to the top of the page
+Quote Post
marcio
post 16.12.2008, 23:05:32
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


http://mynthon.net/articles/inne/sql_uwagi/
http://pornel.net/sql
http://www.sql.info.pl/szkolenia/oracle-sq...t-where-in.html

Pokombinuj.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
prond
post 17.12.2008, 12:58:39
Post #5





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Może tak:
  1. SELECT
  2. tag,count(*)
  3. FROM ( SELECT Tag1 AS tag FROM LINKI UNION ALL
  4. SELECT Tag2 AS tag FROM LINKI UNION ALL
  5. SELECT Tag3 AS tag FROM LINKI UNION ALL
  6. SELECT Tag4 AS tag FROM LINKI
  7. ) AS tags
  8. GROUP BY tag;


Nie zastanawiałem się szczególnie nad optymalnością, ale powinno działać.
Sprawdź też czy MySQL przyjmie UNION ALL (nie pamiętam już jak to jest w tych MySQL'ach).
Słówko ALL gwarantuje, że zapytanie nie wyrzuci duplikatów. Jeśli UNION ALL
nie przejdzie to napisz tak:
  1. SELECT
  2. tag,count(*)
  3. FROM ( SELECT id,Tag1 AS tag FROM LINKI UNION ALL
  4. SELECT id,Tag2 AS tag FROM LINKI UNION ALL
  5. SELECT id,Tag3 AS tag FROM LINKI UNION ALL
  6. SELECT id,Tag4 AS tag FROM LINKI
  7. ) AS tags
  8. GROUP BY tag;


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
nrm
post 17.12.2008, 13:48:39
Post #6





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


masz źle zaprojektowaną bazę. po co są osobne kolumny na tagi?!?


--------------------
Go to the top of the page
+Quote Post
palixmp
post 17.12.2008, 15:50:55
Post #7





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 19.07.2006

Ostrzeżenie: (0%)
-----


normanos dzieki za odpowiedź, a jak mam zaprojektowac?? Bo najlepszym rozwiązaniem bylo by wpisywanie TAG-ow oddzielonych spacją, ale nie umiem zrobic takiego zapytania(czy czegos innego) aby rozróznial poszczegolne słowa. A Ty co byś proponowałquestionmark.gif Jestem otwarty na propozycje smile.gif
Go to the top of the page
+Quote Post
nrm
post 17.12.2008, 17:19:23
Post #8





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


to już było wałkowane na tym forum dziesiątki razy.

klasyczne wiele do wielu, 3 tabele: 1: jakies elementy, 2: tagi, 3:relacja tagi_2_elementy

jedno zapytanie wyciagnie wszystko.


--------------------
Go to the top of the page
+Quote Post
palixmp
post 18.12.2008, 12:06:36
Post #9





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 19.07.2006

Ostrzeżenie: (0%)
-----


Znowu dzieki normanos, ale niestety nie mogę znaleź nic konkretnego na tym forum, jest parę tematów o Tag Cloud, ale nie rozumiem w jaki sposób mam rozdzielić poszczególne słowa? Bo jeśli ktoś wpisze w jednym tagu: słow1 słowo2 słowo3, to jak mam zrobic żeby słowo2 powiązać z z danym artykułem? Wszystkie słow to wiem jak powiązać, ale poszczególne jedno słowo to nie sad.gif
Go to the top of the page
+Quote Post
nrm
post 18.12.2008, 14:59:19
Post #10





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


1. string "tag1, tag2, tag3"
2. stringa http://pl.php.net/manual/pl/function.explode.php do tablicy
3. tablice INSERT do odpowiednich tabel


--------------------
Go to the top of the page
+Quote Post
palixmp
post 25.12.2008, 22:17:27
Post #11





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 19.07.2006

Ostrzeżenie: (0%)
-----


Dzięki normanos zrobiłem tak jak napisałeś, zrobiłem explode() i wszystko łądnie pięknie, ale jest jedna rzecz. Nie umiem zapisac tej ostatniej tabeli 3:relacja tagi_2_elementy. Link zapisze, wszsytkie taki po kolei też, ale jak zapisac relacje jeśli id jest nadawany automatycznie podczas dodawania linku(dla TAGu też jest automatycznie) do bazy.

Tag Link
1 5
2 5
3 5
1 9
2 9

Przyznam sie ze nawet niemam pomysłu w jaki sposób umieścic tam te relacje sad.gif

Naprowadzi mnie ktośquestionmark.gif

Z góry dzieki smile.gif

Ten post edytował palixmp 25.12.2008, 22:19:38
Go to the top of the page
+Quote Post
nrm
post 26.12.2008, 12:53:46
Post #12





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


http://pl.php.net/manual/pl/function.mysql-insert-id.php


--------------------
Go to the top of the page
+Quote Post
palixmp
post 28.12.2008, 23:13:41
Post #13





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 19.07.2006

Ostrzeżenie: (0%)
-----


Mam pytanie, w jaki sposób z tych wszystkich tabel, wyświetlic linki według jednego TAGA?? Np:
w pierwszym linku sa taki a, b,c
w drugim a, c, d
w trzecim b,d,e

Chce wyświetlic linki które zawierają w sobie tag A, czyli powinien wyświetlic pierwszy i drugi link, ale jak to zrobic:(

Stworzyłem coś takiego:

  1. SELECT l.*, pt.*, Tag
  2. FROM TAGI, PLINK_TAG pt LEFT JOIN LINKI l ON pt.P_Link=l.IDLinku
  3. WHERE Tag='poczta';


Ale niestety coś jest nie tak, w ogole wyświetla jakieś bzdury. Pomoże ktoś w napisaniu tego zapytania??

Z gory dzieki

.

Ten post edytował palixmp 28.12.2008, 23:12:43
Go to the top of the page
+Quote Post
melkorm
post 29.12.2008, 00:16:37
Post #14





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


LIKE

Powinno pomóc - powinieneś sobie poradzić ;]


--------------------
Go to the top of the page
+Quote Post
nrm
post 29.12.2008, 10:21:57
Post #15





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


LIKE nie ruszaj to bez sensu.

Musisz połączyć 3 tabele, a w twoim zapytaniu widać 2.

Np. coś takiego (pisane z palca, niekoniecznie musi działać, ma pokazać schemat)

  1. SELECT *
  2. FROM links AS l, links2tags AS lt, tags AS t
  3. WHERE t.tag_name = $tag AND t.tag_id = lt.tag_id AND l.link_id = lt.link_id


to samo można zapisać LEFT JOINami.

Ten post edytował normanos 29.12.2008, 10:23:24


--------------------
Go to the top of the page
+Quote Post
melkorm
post 29.12.2008, 18:30:42
Post #16





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Założyłem że kolega ma pole w postaci 'tag1,tag2,tag3....' :] chyba coś źle wywnioskowałem~~ brzydal.gif


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 00:46