SELECT DISTINCT maar dan nog met de overige gevens getoond in een tabel
Ik wel een tabel tonen maar dan wel met SELECT DISTINCT zodat ik geen dubbele records krijg.
Op zich leek mij dat niet zo'n probleem maar loop ik nu toch wel een beetje vast :-(
Om te zorgen dat ik geen dubbele records toon heb ik het volgende :
$query = "SELECT DISTINCT emailaddress FROM table_1 ORDER BY emailaddress ASC";
$result = mysql_query($query) or die(mysql_error());
while ($array = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "<tr>";
echo "<td valign='top'>".$array['emailaddress']."</td>";
echo "</tr>";
}
Ik heb dus nu een kolom met daarin alle unieke e-mail adressen gesorteerd op alfabet.
Maar nu wil ik uit deze zelfde tabel_1 ook nog de achternaam die bij het e-mail adres hoort en vanuit een andere tabel_2 wil ik andere gegevens hebben. In tabel_1 heb ik ook natuurlijk een unieke ID die overeenkomt met het ID in tabel_2
Hopelijk kan iemand mij op weg helpen om de andere gegevens uit tabel 1 te tonen maar ook de gekoppelde gegevens uit tabel 2.
Met vriendelijke groeten,
Arie
DISTINCT gaat over alle velden en niet alleen het eerste veld. Als je in de tweede tabel het email twee keer heb met twee verschillende namen en je haalt zowel het email als de naam op dan krijg je dus twee resultaten
Ik heb in de 2e tabel geen e-mail adres staan, wel een ID wat gekoppeld is aan het ID in tabel 1 waar dus wel het e-mail adres staat.
Ik zit ondertussen nog eebns wat te lezen en vraag mij af of ik mijn probleem ook niet met een Join kan oplossen? Zo ja, iemand een suggestie ??
Met vriendelijke groeten,
Arie
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT
table_1.email_id,
table_2.name
FROM
table_1
INNER JOIN table_2 ON table_1.email_id = table_2.email_id
table_1.email_id,
table_2.name
FROM
table_1
INNER JOIN table_2 ON table_1.email_id = table_2.email_id
Maar dat is het niet, je kan het wel groupen maar dat geeft onvoorspelbaar resultaat dus moet je eigenlijk niet doen
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
table_1.email_id,
table_2.name
FROM
table_1
INNER JOIN table_2 ON table_1.email_id = table_2.email_id
GROUP BY
table_1.email_id
table_1.email_id,
table_2.name
FROM
table_1
INNER JOIN table_2 ON table_1.email_id = table_2.email_id
GROUP BY
table_1.email_id
Hoe het dan hoort is dat je moet aanduiden welk veld je dan wilt hebben
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
table_1.email_id,
MIN(table_2.name) AS name
FROM
table_1
INNER JOIN table_2 ON table_1.email_id = table_2.email_id
GROUP BY
table_1.email_id
table_1.email_id,
MIN(table_2.name) AS name
FROM
table_1
INNER JOIN table_2 ON table_1.email_id = table_2.email_id
GROUP BY
table_1.email_id
Nu krijg je het email met de eerste naam in het alphabet die in tabel twee staat met dat email
Maarja dat is weer lullig voor de volgende naam ;(
Gewijzigd op 06/01/2012 15:42:30 door Jelle -
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT t1.name, t2.emailaddress
FROM table_1 t1
INNER JOIN (
SELECT DISTINCT emailaddress
FROM table_1
) t2 ON t1.emailaddress = t2.emailaddress;
FROM table_1 t1
INNER JOIN (
SELECT DISTINCT emailaddress
FROM table_1
) t2 ON t1.emailaddress = t2.emailaddress;
De subquery geeft nu alle unieke emailaddressen, waarbij er een name uit de originele tabel bij wordt gehaald. Een andere tabel kan je er natuurlijk ook nog aan joinen op de gebruikelijke manier.
Helaas wilt het nog niet lukken, ik heb nu wel via de INNER JOIN hetzelfde op het scherm als wat ik had met SELECT DISTINCT ;-)
@Erwin, ik begrijp niet helemaal wat jij bedoelt met t1 en t2, of bedoelt jij daar as t1 en as t2 mee? Maar dan staat het ) voor t2 toch verkeerd? Dat moet toch na t2?
Met vriendelijke groeten,
Arie
Gewijzigd op 06/01/2012 17:01:43 door Arie Kant
En ja het zijn aliassen en nee dat haakje staat niet verkeerd. Alles wat tussen de haakjes staat moet je zien als een tabel. Dus je creeert een tijdelijke (virtuele) tabel alszijnde:
en die virtuele tabel noem je nu t2. Dus niet heel tabel_1, maar alleen die selectie eruit.
Ik blijf alleen nog steeds de complete lijst zijn, dus ook met dubbele records qua email adressen.
Het is misschien wel zo dat de praktijk iets uitgebreider is dan de oorspronkelijke vraagstelling dus ik zal nu even wat uitgebreider op het probleem ingaan.
Ik heb 2 tabellen:
email_list_subscribers met daarin de kolommen subscriberid, mailaddress en listid
email_subscribers_data met daarin de kolommen subscriberid, fieldid en data
Nu is het zo dat in de tabel email_subscribers_data elk record apart is opgenomen, daarmee bedoel ik dat voor 1 contactpersoon 4 records zijn voor zijn voorletters fieldid = 2), achternaam (fieldid = 4), postcode (fieldid = 13) en aanhef (fieldid = 15).
Momenteel heb ik de volgende query :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$query = "SELECT
sub.subscriberid as id,
sub.emailaddress as email,
sub.listid as listid
FROM email_list_subscribers sub
INNER JOIN ( SELECT DISTINCT emailaddress FROM email_list_subscribers ) sub2 ON sub.emailaddress = sub2.emailaddress
ORDER BY sub.emailaddress ASC";
$result = mysql_query($query) or die(mysql_error());
while ($array = mysql_fetch_array($result, MYSQL_ASSOC)) {
$extra_data_voorletters = mysql_query("SELECT * FROM email_subscribers_data WHERE subscriberid = '".$array['id']."' AND fieldid = 2") or die(mysql_error());
$extra_data_row_voorletters = mysql_fetch_array($extra_data_voorletters, MYSQL_ASSOC);
$extra_data_achternaam = mysql_query("SELECT * FROM email_subscribers_data WHERE subscriberid = '".$array['id']."' AND fieldid = 4") or die(mysql_error());
$extra_data_row_achternaam = mysql_fetch_array($extra_data_achternaam, MYSQL_ASSOC);
$extra_data_postcode = mysql_query("SELECT * FROM email_subscribers_data WHERE subscriberid = '".$array['id']."' AND fieldid = 13") or die(mysql_error());
$extra_data_row_postcode = mysql_fetch_array($extra_data_postcode, MYSQL_ASSOC);
$extra_data_aanhef = mysql_query("SELECT * FROM email_subscribers_data WHERE subscriberid = '".$array['id']."' AND fieldid = 15") or die(mysql_error());
$extra_data_row_aanhef = mysql_fetch_array($extra_data_aanhef, MYSQL_ASSOC);
$extra_data_list = mysql_query("SELECT name FROM email_lists WHERE listid = '".$array['listid']."' ") or die(mysql_error());
$extra_data_row_list = mysql_fetch_array($extra_data_list, MYSQL_ASSOC);
echo "<tr>";
echo "<td valign='top'>".$array['id']."</td>";
echo "<td valign='top'>".$array['email']."</td>";
echo "<td valign='top'>".$extra_data_row_voorletters['data']."</td>";
echo "<td valign='top'>".$extra_data_row_achternaam['data']."</td>";
echo "<td valign='top'>".$extra_data_row_postcode['data']."</td>";
echo "<td valign='top'>".$extra_data_row_aanhef['data']."</td>";
echo "<td valign='top'>".$extra_data_row_list['name']."</td>";
echo "</tr>";
}
sub.subscriberid as id,
sub.emailaddress as email,
sub.listid as listid
FROM email_list_subscribers sub
INNER JOIN ( SELECT DISTINCT emailaddress FROM email_list_subscribers ) sub2 ON sub.emailaddress = sub2.emailaddress
ORDER BY sub.emailaddress ASC";
$result = mysql_query($query) or die(mysql_error());
while ($array = mysql_fetch_array($result, MYSQL_ASSOC)) {
$extra_data_voorletters = mysql_query("SELECT * FROM email_subscribers_data WHERE subscriberid = '".$array['id']."' AND fieldid = 2") or die(mysql_error());
$extra_data_row_voorletters = mysql_fetch_array($extra_data_voorletters, MYSQL_ASSOC);
$extra_data_achternaam = mysql_query("SELECT * FROM email_subscribers_data WHERE subscriberid = '".$array['id']."' AND fieldid = 4") or die(mysql_error());
$extra_data_row_achternaam = mysql_fetch_array($extra_data_achternaam, MYSQL_ASSOC);
$extra_data_postcode = mysql_query("SELECT * FROM email_subscribers_data WHERE subscriberid = '".$array['id']."' AND fieldid = 13") or die(mysql_error());
$extra_data_row_postcode = mysql_fetch_array($extra_data_postcode, MYSQL_ASSOC);
$extra_data_aanhef = mysql_query("SELECT * FROM email_subscribers_data WHERE subscriberid = '".$array['id']."' AND fieldid = 15") or die(mysql_error());
$extra_data_row_aanhef = mysql_fetch_array($extra_data_aanhef, MYSQL_ASSOC);
$extra_data_list = mysql_query("SELECT name FROM email_lists WHERE listid = '".$array['listid']."' ") or die(mysql_error());
$extra_data_row_list = mysql_fetch_array($extra_data_list, MYSQL_ASSOC);
echo "<tr>";
echo "<td valign='top'>".$array['id']."</td>";
echo "<td valign='top'>".$array['email']."</td>";
echo "<td valign='top'>".$extra_data_row_voorletters['data']."</td>";
echo "<td valign='top'>".$extra_data_row_achternaam['data']."</td>";
echo "<td valign='top'>".$extra_data_row_postcode['data']."</td>";
echo "<td valign='top'>".$extra_data_row_aanhef['data']."</td>";
echo "<td valign='top'>".$extra_data_row_list['name']."</td>";
echo "</tr>";
}
Ik krijg dan op het scherm een tabel te zien maar wel nog met dubbele e-mail adressen in deze lijst en dat is nu net wat ik eigenlijk niet wil.
Iemand enig idee waar het fout gaat?
Met vriendelijke groeten,
Arie Kant
sub.emailaddress as email
het volgende van maakt:
sub2.emailaddress as email
En dan dus ook de ORDER BY. Ergens heb ik niet het idee dat dit gaat uitmaken... maar probeer het eerst eens.
Overigens, de rest van je queries kan je denk ik ook gewoon met JOINS in dezelfde query krijgen zodat je niet 6 queries hoeft door te gaan, maar maar 1.
Het leek idd een mooie optie om sub.emailadress te wijzigen in sub2.emailadress maar helaas zie ik nog steeds records met dezelfde e-mail adressen erin.
ZXoals je ziet, joins is niet mijn sterkste ding, vandaar dat ik die andere query's eerst maar even 'voluit' hebt geschreven. Als deze 1e join nu goed gaat, kan ik eens gaan kijken lof ik die andere 6 query's kan vereenvoudigen ;-)
Met vriendelijke groeten,
Arie
Maar, omdat ik je niet in de kou wilde laten staan een andere oplossing gezocht en gevonden. Deze heb ik getest en bij mij leverde het echt op wat ik wilde, dus het zou de oplossing voor je moeten zijn... maar vertrouw me niet meer op mijn woorden :-)
Maar bedankt voor de oplossing, het werkt als een trein !
Blijkbaar zat ik met de SELECT DISTINCT toch op de goede weg, alleen kreeg ik de laatste puntjes niet op de i ;-)
Nogmaals bedankt voor het meedenken in deze en mocht er een volgende keer komen, dan zou het zo maar kunnen zijn dat ik je weer op je woord gaat geloven ... hahaahahaha
Met vriendelijke groeten,
Arie
Mooi, ik ben blij dat dit wel werkt. Als je nog hulp nodig hebt met die JOINS om de andere gegevens erin te krijgen dan horen we het wel ;-)