SELECT DISTINCT maar dan nog met de overige gevens getoond in een tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Arie Kant

Arie Kant

06/01/2012 15:07:17
Quote Anchor link
Hallo,

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
 
PHP hulp

PHP hulp

14/11/2024 07:35:25
 
Jelle -

Jelle -

06/01/2012 15:10:10
Quote Anchor link
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
 
Arie Kant

Arie Kant

06/01/2012 15:30:03
Quote Anchor link
Bedankt voor je reactie!

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
 
Jelle -

Jelle -

06/01/2012 15:41:15
Quote Anchor link
Als je zorgt dat emails uniek zijn in tabel twee had je zo kunnen doen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Maar dat is het niet, je kan het wel groupen maar dat geeft onvoorspelbaar resultaat dus moet je eigenlijk niet doen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Hoe het dan hoort is dat je moet aanduiden welk veld je dan wilt hebben

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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 -
 
Erwin H

Erwin H

06/01/2012 16:09:53
Quote Anchor link
Je kan het wel doen met een join op een subquery. Zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;

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.
 
Arie Kant

Arie Kant

06/01/2012 17:01:27
Quote Anchor link
Bedankt voor de snelle reactie.

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
 
Erwin H

Erwin H

06/01/2012 17:42:34
Quote Anchor link
Probeer het eens zou ik zeggen :-)
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
SELECT DISTINCT emailaddress
FROM table_1

en die virtuele tabel noem je nu t2. Dus niet heel tabel_1, maar alleen die selectie eruit.
 
Arie Kant

Arie Kant

09/01/2012 09:47:43
Quote Anchor link
Nou, ik kan wel verklappen dat ik het wel geprobeerd hebt .......... ;-)

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)
PHP script in nieuw venster Selecteer het PHP script
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
$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>";        
}


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
 
Erwin H

Erwin H

09/01/2012 10:00:24
Quote Anchor link
Als je hier:

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.
 
Arie Kant

Arie Kant

09/01/2012 10:08:20
Quote Anchor link
Beste Erwin,

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
 
Erwin H

Erwin H

09/01/2012 10:40:45
Quote Anchor link
Stom, mijn fout. Helemaal mijn fout, en het gaat niet werken ook. Ik had het getest op een van mijn tabellen en daar leek uit te komen wat ik wilde.... alleen was dat puur toeval. Vanwege de data die erin stond. Getest op een andere tabel en het werkte voor geen meter.... Ga je dan...

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 :-)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT DISTINCT
    MIN(subscriberid) as id,
    emailaddress as email,
    listid
FROM email_list_subscribers
GROUP BY email;
 
Arie Kant

Arie Kant

09/01/2012 12:15:47
Quote Anchor link
hahahaah, geeft niet he ! Je bent voor het resultaat altijd afhankelijk van de data die in je tabel staat ;-)

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
 
Erwin H

Erwin H

09/01/2012 12:26:18
Quote Anchor link
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 ;-)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.