webForumDet fria alternativet

Count, räkna ihop från flera olika tabeller

Databaser & SQL

5 svar · 707 visningar · startad av Php

Medlem sedan sep. 2001224 inlägg
Frågan#1

Hej,
Det är så att jag vill räkna ihop antalet poster, som tillhör en viss användare, från 5 olika tabeller.

Något i den här stillen:

Antalet poster från:

Tabell 1: members
Argument: where refer = '800'
+
Tabell 2: book
Argument: where member_id = '800'
+
Tabell 3: bookc
Argument: where p_id = '800'
+
Tabell 4: games
Argument: where p_id = '800'
+
Tabell 5: messages
Argument: where s_id = '800'
+
Till sist vill jag till summan addera ett värde, som hämtas från fältet "logins" i tabellen "members".

Nu är min fråga om det finns något enkelt sätt att direkt vid SQL satsen räkna ihop denna summan?

Medlem sedan dec. 19996 721 inlägg
#2

Det finns måååånga sätt, lite beroende på DBMS...

DISTINCT-count (kräver att det finns en unik nyckel i varje tabell)

select m.logins + count(distinct r.nyckel)+count(distinct b.nyckel)+count(distinct bc.nyckel)+count(distinct g.nyckel)+count(distinct msg.nyckel)
from members m
left outer join members r on m.id=r.refer
left outer join book b on m.id=b.member_id
left outer join bookc bc on m.id=bc.p_id
left outer join games g on m.id=g.p_id
left outer join messages msg on m.id=msg.s_id

Subselect


select m.logins + (select count(*) FROM book WHERE member_id=m.id) + (select count(*) FROM bookc WHERE p_id=m.id)  osv...
from members m

Derived table + UNION

select sum(d.countval) from
(
select logins as countval from members where id=800
union
select count(*) FROM book WHERE member_id=800
union
....
)

..och ett par till varianter

Medlem sedan sep. 2001224 inlägg
#3

Jag försöker använda union, men den printar bara ut -1!

select sum(d.countval) from
(
select logins as countval from members where id=800
union
select count(*) FROM book WHERE member_id=800
)

$antal = mysql_affected_rows();
echo"$antal";

Medlem sedan juni 200032 967 inlägg
#4

Du ska inte använda mysql_affected_rows(), inga poster påverkas av en select-fråga. Hämta ut datat på vanligt sätt (det kan alltså vara vettigt att sätta alias på det du ska hämta ut så du har något att referera till i utskriften i php-koden).

select sum(d.countval) [b]as min_summa[/b] from...

Om du ska referera till d.countval i din SQL-fråga måste du nog också ange d som alias på din derived table.

Medlem sedan sep. 2001224 inlägg
#5

Får tyvärr fortfarande inte ihop det med union. Får följande felmeddelande:
#1248 - Every derived table must have its own alias

Om du ska referera till d.countval i din SQL-fråga måste du nog också ange d som alias på din derived table.

Vad är en derived table för något?

select sum(d.countval) as summa from
(
select logins as countval from members where id=800
union
select count(*) FROM book WHERE member_id=800
)
Medlem sedan juni 200032 967 inlägg
#6

En "derived table" är, enkelt uttryckt, det som blir resultatet av din subselect - en "tabell" du kan göra ytterligare utsökningar ifrån.

select sum(d.countval) as summa from
(
select logins as countval from members where id=800
union
select count(*) FROM book WHERE member_id=800
) [b]as d[/b]
255 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)