qualitum logo
Spara data från flera tabeller till ny tabell?

PHPportalen Forum Index » Databaser
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
dQJQb



Medlem i: 555 dagar
Från: Sundsvall
Status: Offline



#720540
Inlägg Skrivet: 2012-02-13 23:09      Ämne: Spara data från flera tabeller till ny tabell? Citera

Jag hade tänkt att skapa en ny tabell som innehåller användarstatistik, fast problemet är att jag inte har den blekaste på hur jag ska göra detta.
Jag har sett ett framework där de rätt och slätt fanns en tabell som innehöll en tabell "stats" med 2 fält som innehöll "name" och "content".

Här är den aktuella tabellstrukturen med kommentarer nedanför varje tabell på vilken data jag skulle vilja spara ner för att kunna använda senare.
KOD:
1:
 
2:
-- Tabellstruktur `comments`
3:
--
4:
 
5:
CREATE TABLE IF NOT EXISTS `comments` (
6:
  `comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
7:
  `comment_by` varchar(25) NOT NULL,
8:
  `comment_on_post_id` int(10) unsigned NOT NULL,
9:
  PRIMARY KEY (`comment_id`)
10:
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=79 ;
11:
 
12:
--// Från 'comments' skulle jag vilja räkna hur många kommentarer en användare har gjort
13:
-- Alltså något i stil med "COUNT(comment_id) AS count_posts WHERE comment_by = 'användaren'"
14:
 
15:
 
16:
 
17:
--
18:
-- Tabellstruktur `posts`
19:
--
20:
 
21:
CREATE TABLE IF NOT EXISTS `posts` (
22:
  `post_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
23:
  `post_creator` varchar(25) NOT NULL,
24:
  `post_views` int(11) unsigned NOT NULL,
25:
  `post_upload_id` int(11) NOT NULL,
26:
  PRIMARY KEY (`post_id`)
27:
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=85 ;
28:
 
29:
--// Från 'posts' skulle jag vilja räkna antalet poster en användare har skapat och även totalt antal visningar som användares poster har genererat.
30:
-- Det vill säga att alla summorna i 'post_views' adderas ihop WHERE post_creator = 'användaren'
31:
 
32:
 
33:
 
34:
--
35:
-- Tabellstruktur `upload`
36:
--
37:
 
38:
CREATE TABLE IF NOT EXISTS `upload` (
39:
  `upload_id` int(11) NOT NULL AUTO_INCREMENT,
40:
  `upload_name` varchar(30) NOT NULL,
41:
  `upload_by_user` varchar(25) NOT NULL,
42:
  `upload_to_post_id` int(11) NOT NULL,
43:
  `upload_dir` varchar(255) NOT NULL,
44:
  PRIMARY KEY (`upload_id`)
45:
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;
46:
 
47:
-- //Från 'upload' skulle jag vilja räkna hur många filer en användare har laddat upp.
48:
 
49:
 
50:
 
51:
 
52:
 
53:
--
54:
-- Tabellstruktur `users`
55:
--
56:
 
57:
CREATE TABLE IF NOT EXISTS `users` (
58:
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
59:
  `user_name` varchar(25) NOT NULL,
60:
  PRIMARY KEY (`user_id`),
61:
  UNIQUE KEY `user_name` (`user_name`)
62:
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=91 ;


Jag är som sagt mycket osäker på hur jag ska göra för att kunna hantera datan på enklaste vis och jag har hört talats om VIEWS, och funderar på om det kan vara lämpligt att använda sig av här. Dock kan jag i princip ingenting om VIEWS.
Jag vet inte heller hur jag skulle gå till väga för att spara ner datan till en helt ny tabell, men strukturen skulle kunna se ut så här:

" TABLE 'user_stat'
`posts` int(11)
`generated_post_views` int(11)
`comments` int(11)
`uploads` int(11)"

Det kan hända att jag även vill ha reda på hur många "comments" en "post" har genererad av en "user" och då måste man joina 3 olika tabeller och det har jag inte heller någon aning på hur man gör.

Men det är främst "antalet poster", "antalet genererade post-visningar", "antalet kommentarer av användaren" och "antalet uppladdningar".
Så om någon orkar visa ett bra sätt för att få till detta för att få detta så skulle det vara riktigt shysst.

Jag får som vanligt be om ursäkt om jag var för dålig på att förklara Razz
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
dQJQb



Medlem i: 555 dagar
Från: Sundsvall
Status: Offline



#720623
Inlägg Skrivet: 2012-02-16 17:20      Ämne: Citera

Hur ska jag göra för att bilda en query av dessa 4?

KOD:
1:
 
2:
   $sql1 =   
3:
"SELECT
4:
   COUNT(comments.comment_id) AS comment_count
5:
FROM comments
6:
   WHERE comments.comment_by = '".$_SESSION['username']."'";
7:
   
8:
-----
9:
 
10:
   $sql2 =   
11:
"SELECT
12:
   COUNT(upload.upload_id) AS upload_count
13:
FROM upload   
14:
   WHERE upload.upload_by_user = '".$_SESSION['username']."'";
15:
   
16:
----
17:
   
18:
   $sql3 =
19:
"SELECT
20:
   COUNT(posts.post_id) AS post_count
21:
FROM posts
22:
   WHERE posts.post_creator = '".$_SESSION['username']."' AND posts.post_conf= ". 1 ."
23:
";
24:
 
25:
----
26:
 
27:
   $sql4 =
28:
"SELECT
29:
   SUM(post_views) AS total_views
30:
FROM posts
31:
   WHERE post_creator = '".$_SESSION['username']."' AND post_conf= ". 1 ."
32:
";
33:
 
34:
 


Jag skulle även helst slippa att plocka från dessa 4 tabeller varje gång och istället skapa en ny tabell eller en "view?" som får en relation till användaren.

Men framförallt hur ska jag göra för att bilda en query av detta?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
marulken



Medlem i: 1879 dagar
Från: Stockholm
Status: Offline



#720626
Inlägg Skrivet: 2012-02-16 17:44      Ämne: Citera

Vet inte riktigt om det är detta du vill göra, om du bara ska köra COUNT är det bättre att köra subqueries, men om du vill börja hämta mer info, får du nog köra left joins.

PHP:
1:
 
2:
 
3:
SELECT c.*, (SELECT COUNT(upload_idFROM upload WHERE upload_by_user c.comment_by) as uploadCount,
4:
         (SELECT COUNT(post_idFROM posts WHERE post_creator c.comment_by) as postCount,
5:
         (SELECT SUM(post_viewsFROM posts WHERE post_creator c.comment_by) as sumPost
6:
   FROM comments as C
7:
WHERE c.comment_by '$username' 
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
dQJQb



Medlem i: 555 dagar
Från: Sundsvall
Status: Offline



#720763
Inlägg Skrivet: 2012-02-19 22:41      Ämne: Citera

marulken skrev:
Vet inte riktigt om det är detta du vill göra, om du bara ska köra COUNT är det bättre att köra subqueries, men om du vill börja hämta mer info, får du nog köra left joins.

PHP:
1:
 
2:
 
3:
SELECT c.*, (SELECT COUNT(upload_idFROM upload WHERE upload_by_user c.comment_by) as uploadCount,
4:
         (SELECT COUNT(post_idFROM posts WHERE post_creator c.comment_by) as postCount,
5:
         (SELECT SUM(post_viewsFROM posts WHERE post_creator c.comment_by) as sumPost
6:
   FROM comments as C
7:
WHERE c.comment_by '$username' 

Tack det där fungerar, dock kommer jag antagligen bygga ut statistiken ännu mer och tror därför att det skulle vara bäst med en VIEW, sedan vill jag även ha den mer lätthanterlig när jag måste köra querys för att hämta statistiken.

KOD:
1:
   
2:
"CREATE VIEW user_stat
3:
      AS
4:
   SELECT
5:
      COUNT(up.upload_id) as uploadCount, COUNT(po.post_id) as postCount, SUM(po.post_views) as viewsSum, us.user_name
6:
   FROM users as us LEFT JOIN posts as po
7:
      ON us.user_name = po.post_creator
8:
   LEFT JOIN upload up
9:
      ON up.upload_by_user = us.user_name
10:
   WHERE po.post_creator = us.user_name ";


Som ni ser har jag försökt att skapa en VIEW, men den ger bara en rad med vädligt märkliga summor troligen allt ihop slaget trots att jag har flera användarnamn i tabellen users.
Jag är riktigt kass på det här med JOINS, är det så att jag behöver köra subquerys trots att jag joinar för att få ut alla rader till VIEW:en på rätt sätt?

Alla summor ska alltså vara knyten till en unik användare i varje rad i VIEW:en user_stat.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
dQJQb



Medlem i: 555 dagar
Från: Sundsvall
Status: Offline



#720993
Inlägget är accepterad som det rätta svaret Skrivet: 2012-02-24 17:50      Ämne: Citera

Kör en bump här.

Är det någon som vet varför jag bara får ut en rad för en användare med detta syntax, trots att jag har flera användare i databasen som har gjort flera inlägg?
KOD:
1:
   "SELECT
2:
      COUNT(up.upload_id) as uploadCount, COUNT(po.post_id) as postCount, SUM(po.post_views) as viewsSum, us.user_name
3:
   FROM users as us LEFT JOIN posts as po
4:
      ON us.user_name = po.post_creator
5:
   LEFT JOIN upload up
6:
      ON up.upload_by_user = us.user_name
7:
   WHERE po.post_creator = us.user_name ";


Edit:
Jag hade bara krånglat till det onödigt med joins.

KOD:
1:
 
2:
CREATE VIEW stat
3:
   AS
4:
SELECT
5:
      us.user_name,
6:
      (SELECT COUNT(upload_id) FROM upload WHERE upload_by_user = us.user_name) as uploadCount,
7:
      (SELECT COUNT(post_id) FROM posts WHERE post_creator = us.user_name) as postCount,
8:
      (SELECT SUM(post_views) FROM posts WHERE post_creator = us.user_name) as viewsSum
9:
   FROM users us
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » Databaser
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic
qualitum logo