Räkna poster i DB

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
snylften



Medlem i: 3784 dagar

Status: Offline



#740439
Inlägg Skrivet: 2016-02-12 18:53      Ämne: Räkna poster i DB Citera

Jag har en tabell där jag lagrar ord och en tidstämpel.
Det finns ingen PK.
Jag vill lista de 10 ord som förekommer flest gånger i tabellen och sortera dem i ordning efter hur många gånger ordet förekommer.

Jag kan inte komma på hur jag ska lösa detta, kanske någon har ett bra tips?
Här kommer lite kod
KOD:
1:
-- phpMyAdmin SQL Dump
2:
CREATE TABLE IF NOT EXISTS `stats_input_keywords` (
3:
  `keyword` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
4:
  `timedate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
5:
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
6:
 
7:
--
8:
-- Dumping data for table `stats_input_keywords`
9:
--
10:
 
11:
INSERT INTO `stats_input_keywords` (`keyword`, `timedate`) VALUES
12:
('golf', '2016-02-11 14:13:50'),
13:
('uddevalla', '2016-02-11 14:13:50'),
14:
('bmw', '2016-02-11 14:13:57'),
15:
('golf', '2016-02-11 14:14:05'),
16:
('uddevalla', '2016-02-11 14:14:05'),
17:
('golf', '2016-02-11 14:14:07'),
18:
('uddevalla', '2016-02-11 14:14:07'),
19:
('golf', '2016-02-11 14:14:09'),
20:
('uddevalla', '2016-02-11 14:14:09'),
21:
('golf', '2016-02-11 14:14:10'),
22:
('uddevalla', '2016-02-11 14:14:10'),
23:
('golf', '2016-02-11 14:14:12'),
24:
('uddevalla', '2016-02-11 14:14:12'),
25:
('golf', '2016-02-11 14:14:13'),
26:
('uddevalla', '2016-02-11 14:14:13'),
27:
('golf', '2016-02-11 14:14:14'),
28:
('uddevalla', '2016-02-11 14:14:14'),
29:
('golf', '2016-02-11 14:14:16'),
30:
('uddevalla', '2016-02-11 14:14:16'),
31:
('golf', '2016-02-11 14:14:17'),
32:
('uddevalla', '2016-02-11 14:14:17'),
33:
('bildekk', '2016-02-11 14:17:04'),
34:
('og', '2016-02-11 14:17:04'),
35:
('felger', '2016-02-11 14:17:04'),
36:
('bilforhandlere', '2016-02-11 14:17:10'),
37:
('maskiner', '2016-02-11 14:18:56'),
38:
('strømstad', '2016-02-11 14:20:13'),
39:
('ovner', '2016-02-11 14:22:29'),
40:
('og', '2016-02-11 14:22:29'),
41:
('peiser', '2016-02-11 14:22:29'),
42:
('buars', '2016-02-11 14:23:15'),
43:
('sko', '2016-02-11 14:25:50'),
44:
('brukt', '2016-02-11 15:02:05'),
45:
('dagligvarer', '2016-02-11 15:05:16'),
46:
('100', '2016-02-11 15:10:45'),
47:
('hoteller', '2016-02-11 15:11:06'),
48:
('og', '2016-02-11 15:11:06'),
49:
('andre', '2016-02-11 15:11:06'),
50:
('overnattingssteder', '2016-02-11 15:11:06'),
51:
('bensinstasjoner', '2016-02-11 15:12:04'),
52:
('jernvarer', '2016-02-11 15:12:25'),
53:
('lekia', '2016-02-11 15:17:54'),
54:
('husflid,', '2016-02-11 15:26:24'),
55:
('garn,', '2016-02-11 15:26:24'),
56:
('tekstiler', '2016-02-11 15:26:24'),
57:
('og', '2016-02-11 15:26:24'),
58:
('tilbehør', '2016-02-11 15:26:24'),
59:
('kroppspleie', '2016-02-11 15:31:28'),
60:
('taxi', '2016-02-11 15:33:02'),
61:
('severdigheter', '2016-02-11 15:35:39');
62:
 
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 3991 dagar
Från: Tavesta
Status: Offline



#740441
Inlägg Skrivet: 2016-02-13 00:20      Ämne: Citera

GROUP BY borde nog kunna vara en lösning på ditt problem:
KOD:
1:
SELECT COUNT(*) AS antal, keyword FROM stats_input_keywords GROUP BY keyword ORDER BY antal DESC LIMIT 10
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
snylften



Medlem i: 3784 dagar

Status: Offline



#740444
Inlägg Skrivet: 2016-02-13 14:57      Ämne: Citera

Toppen! Det funkar fint. Jag har modifierat koden lite med BETWEEN 2 olika datum, och det funkar fint när jag kör den i phpmyadmin men när jag använder den i kod så funkar det inte. Någon aning om vad det kan bero på? Så fort jag tar bort WHERE (timedate BETWEEN '2016-02-12 00:00:00' AND '2016-02-13 13:53:54') så funkar det igen.

Så här ser queryn ut
KOD:
1:
SELECT COUNT(*) AS antal, keyword, timedate FROM `stats_input_keywords` WHERE (timedate BETWEEN '2016-02-12 00:00:00' AND '2016-02-13 13:53:54') GROUP BY keyword ORDER BY antal DESC LIMIT 5
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 3991 dagar
Från: Tavesta
Status: Offline



#740445
Inlägg Skrivet: 2016-02-13 21:10      Ämne: Citera

Du borde kunna köra en underordnad databasfråga som gör urvalet:

KOD:
1:
SELECT COUNT(*) AS antal, keyword FROM (
2:
   SELECT keyword
3:
   FROM stats_input_keywords
4:
   WHERE timedate BETWEEN '2016-02-12 00:00:00' AND '2016-02-13 13:53:54'
5:
) AS x
6:
GROUP BY keyword ORDER BY antal DESC LIMIT 5


OM du vill ha med timedate i utmatningen så måste du fundera över från vilken av posterna den skall hämtas.
Det borde kunna åstadkommas genom att t.ex sortera den underordnade databasfrågan.
Annars blir det en slumpmässig post.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
snylften



Medlem i: 3784 dagar

Status: Offline



#740446
Inlägg Skrivet: 2016-02-14 09:33      Ämne: Citera

Tack, det gick bra. Jag fick även med timedate genom att lägga till de på båda frågorna. MEN så fort jag kör den i kod så funkar det inte, skriver jag istället ut frågan, klipper ut den och klistrar in den i phpMyAdmin så funkar det bra. Då tror man ju att det är något fel på PHP koden, men om jag i koden kör en annan fråga tex "SELECT keyword,timedate FROM stats......" så funkar det fint.

Blir inte klok på detta alls varför det krånglar så fort jag blandar in BETWEEN?

KOD:
1:
  $frmDte = date("Y-m-d H:i:s",strtotime("yesterday"));
2:
  $toDte = date("Y-m-d H:i:s",strtotime("now"));
3:
  $limitNum = 5;
4:
$query = "SELECT COUNT(*) AS antal, keyword, timedate FROM (
5:
   SELECT keyword, timedate
6:
   FROM stats_input_keywords
7:
   WHERE timedate BETWEEN '".$frmDte."' AND '".$toDte."'
8:
) AS x
9:
GROUP BY keyword ORDER BY antal DESC LIMIT ".$limitNum." ";
10:
include "conn.php";
11:
echo $query;   
12:
 
13:
$topSearches = array();
14:
if ($stmtSelsect = mysqli_prepare($connection, $query)) {
15:
   mysqli_stmt_execute($stmtSelsect); /* execute query */
16:
   mysqli_stmt_bind_result($stmtSelsect, $antal, $keyword );  /* bind result variables */   
17:
   while ( mysqli_stmt_fetch($stmtSelsect) ){
18:
      // Lägger till värdena i en array. Värdena ligger i ytterligare en array.
19:
       array_push($topSearches, array($keyword,$antal));
20:
   } // end while
21:
   mysqli_stmt_close($stmtSelsect); /* close statement */
22:
} else {           
23:
  echo ("<p>Fel i SQL fråga 2</p>");
24:
  exit;   
25:
} //end if query2 (create a prepared statement)
26:
echo var_dump($topSearches);
27:
 
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 3991 dagar
Från: Tavesta
Status: Offline



#740447
Inlägg Skrivet: 2016-02-14 14:16      Ämne: Citera

Stämmer antalet fält i mysqli_stmt_bind_result med vad du angivit i sql-koden?
I koden du visar har sql-koden tre fält i utmatningen medan mysqli_stmt_bind_result bara har två parametrar, utöver den för själva databasfrågan.
 

_________________
R.r - Ett fritt affärssystem
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