select distinct mysql werkt niet goed

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ceasar Feijen

Ceasar Feijen

28/12/2010 16:45:49
Quote Anchor link
Het volgende geeft geen goede resultaten.
Ik zie dubbele catagorieen staan.
Wat zie ik over het hoofd of doe ik fout ?

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
<?php
 foreach ($files as $key => $file)  #sorted all files
    {
    $pad = $albumpath.rawurlencode($file);
        $sqlfilter = 'SELECT DISTINCT file , catagorie FROM ' . $mysql_table_prefix . 'photo_files
                      WHERE file = "'
.mysql_real_escape_string(str_replace('//','/',str_replace('./images/','',$pad))).'";';
        $resultfilter = mysql_query($sqlfilter);
        while($rowfilter = mysql_fetch_array($resultfilter)) {
            if ($rowfilter['catagorie'] != '') {
            echo '<li><a href="#">' . $rowfilter['catagorie']. '</a></li>';
            }
        }
  }

  unset( $file );
?>
 
PHP hulp

PHP hulp

24/04/2024 10:41:15
 

28/12/2010 16:50:15
Quote Anchor link
Je doet meerdere keren de query uitvoeren (zonder foutafhandeling, zonder _fetch_assoc). De destinct doe je alleen op file, niet op categorie.
Logisch dat je meerdere keren dezelfde categorie krijgt.
 
Kees Schepers

kees Schepers

28/12/2010 16:55:23
Quote Anchor link
Karl Karl op 28/12/2010 16:50:15:
Je doet meerdere keren de query uitvoeren (zonder foutafhandeling, zonder _fetch_assoc). De destinct doe je alleen op file, niet op categorie.
Logisch dat je meerdere keren dezelfde categorie krijgt.


Niet helemaal waar. Bij MySQL geldt een DISTINCT voor de gehele rij en is een alias van SELECT DISTINCTROW.

Quote:
MySQL manual:
The ALL and DISTINCT options specify whether duplicate rows should be returned. ALL (the default) specifies that all matching rows should be returned, including duplicates. DISTINCT specifies removal of duplicate rows from the result set. It is an error to specify both options. DISTINCTROW is a synonym for DISTINCT.


Ik ben nog niet uitgebreid ingegaan op de context van het probleem, maar waarom gebruik je een DISTINCT in de eerste plaats? Misschien dat het op een andere manier kan?
Gewijzigd op 28/12/2010 16:57:20 door kees Schepers
 

28/12/2010 17:04:18
Quote Anchor link
Kees Schepers op 28/12/2010 16:55:23:
Karl Karl op 28/12/2010 16:50:15:
Je doet meerdere keren de query uitvoeren (zonder foutafhandeling, zonder _fetch_assoc). De destinct doe je alleen op file, niet op categorie.
Logisch dat je meerdere keren dezelfde categorie krijgt.


Niet helemaal waar. Bij MySQL geldt een DISTINCT voor de gehele rij en is een alias van SELECT DISTINCTROW.

Oh, inderdaad, had effe wat anders in m'n kop. Maar sowieso leek mij distinct hier niet de oplossing.
 
Ceasar Feijen

Ceasar Feijen

28/12/2010 17:20:42
Quote Anchor link
Ik heb verschillende bestanden die in de db staan.
Deze kunnen een catagorie hebben, bijv muziek of test.
Bij diverse bestanden staat dan de catagorie muziek.
Aangezien dit een link moet worden naar de bestanden moet ik muziek dus maar een keer hebben
 
Jelmer -

Jelmer -

28/12/2010 17:30:39
Quote Anchor link
Waarom haal je dan ook `file` op?
 
Kees Schepers

kees Schepers

28/12/2010 17:30:44
Quote Anchor link
Ik snap het nog niet helemaal maar kun je dan niet beter alle categorieën in een keer selecteren van alle files?

Zoiets?

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
<?php
foreach ($files as &$file) {
    $pad = $albumpath.rawurlencode($file);
    $file = mysql_real_escape_string(str_replace(array('//','./images/'),array('/',''),$pad.$file));
}


$sql = 'SELECT DISTINCT catagorie FROM ' . $mysql_table_prefix . 'photo_files WHERE file IN("'.implode('","',$files).'"';
$result = mysql_query($sql);

while($row = mysql_fetch_assoc($result)) {
    if(strlen($row['categorie']) > 0) {
        echo '<li><a href="#">' . $row['catagorie']. '</a></li>';
    }
}

?>
 
Ceasar Feijen

Ceasar Feijen

28/12/2010 20:56:59
Quote Anchor link
Helaas werkt dat niet.

Ik post hier even het hele script zodat je kunt zien wat mijn bedoeling is.
Eerst wordt een dir uitgelezen.
Dan wil ik weten welke catagorie elk file heeft in die dir
1 ul voor de catagorieen

Dan haal ik weer alle bestanden uit die dir op en plaats wat meer info bij de plaatjes uit die dir

Script is een beetje lang maar dan begrijpen jullie het

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
37
38
39
40
41
42
43
<?php
 //Instellingen
 $directory = './images/album/portfolio/';    //plaatjes path
 $filter = '.jpg';                  //extensite
 $sort = 2;                         //Op volgorde, datum of niet

 $dh = @opendir($directory);

 while (false !== ($file=@readdir($dh)))
 {

  if (substr($file,0,1)!=".")  #skip
  {
         if (strpos($file, $filter,1)) {

         if($sort == 2){
             $files[filemtime($directory . $file) . $file]=$file;
         }
else{
             $files[]=$file;  #everything else goes into files[]
         }
      }
  }
 }
 @
closedir($dh);

if (chk($files) != '') {

    if ($sort == 1){

        natcasesort($files); //Op natuurlijke volgorde

      }elseif ($sort == 2){


           krsort($files); //Sorteren op datum
           //array_multisort($files, SORT_DESC, $files);


      }else{

        shuffle($files); //willekeurige volgorde !
     }

    $albumpath = str_replace('./images/','',$directory);
    ?>

<div id="portfolio_album">
<ul id="filter">
<li>Filter op:</li>
<li class="current"><a href="#">Alles</a></li>
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
<?php
         foreach ($files as $key => $file)  #sorted all files
            {
            $pad = $albumpath.rawurlencode($file);
                $sqlfilter = 'SELECT DISTINCT catagorie FROM ' . $mysql_table_prefix . 'photo_files
                              WHERE file = "'
.mysql_real_escape_string(str_replace('//','/',str_replace('./images/','',$pad))).'";';
                $resultfilter = mysql_query($sqlfilter);
                while($rowfilter = mysql_fetch_assoc($resultfilter)) {
                    if ($rowfilter['catagorie'] != '') {
                    echo '<li><a href="#">' . $rowfilter['catagorie']. '</a></li>';
                    echo $pad;
                    }
                }
          }

          unset( $file );
          ?>

</ul>
<ul id="portfolio">
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
37
38
<?php
 foreach ($files as $key => $file)  #sorted all files
    {
    //echo $file.'<br />';
    $Namearray = array('_','-','%20');
    $albumtext = ucfirst(RemoveExtension(str_replace($Namearray, ' ', $file)));
    $pad = $albumpath.rawurlencode($file);

      $sql = 'SELECT `file`, `description`, `title`, `link`, `catagorie`, `target` FROM ' . $mysql_table_prefix . 'photo_files
                WHERE file = "'
.mysql_real_escape_string(str_replace('//','/',str_replace('./images/','',$pad))).'";';
      $result = mysql_query($sql);
        if($row = mysql_fetch_assoc($result)){
            $albumdb = ucfirst(RemoveExtension(str_replace($Namearray, ' ', $row['title'])));
            $title = $albumdb;
            if ($row['description'] != '') {
                $desc = $row['description'];
            }
else{
                $desc = $albumdb;
            }

            $link = $row['link'];
            $target = $row['target'];

        }
else{
            $title = $albumtext;
            $desc = '';
            $link = '';
            $target = '';
        }


     $imagetest = './cms/temp/portfolio_' . $file;
        if (file_exists($imagetest)) {
            $imagealbpath = './cms/temp/portfolio_' . rawurlencode($file);
            $dimensions = getimagesize($imagetest);
            $thumbgroote = $dimensions[3];
        }
else{
            $imagealbpath = './cms/thumb_portfolio.php?file=' . $pad;
        }

    ?>

<li class="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $row['catagorie']; ?>
">
<a href="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $directory.rawurlencode($file); ?>
" rel="album">
<img src="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $imagealbpath; ?>
" width="330" height="120" alt="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $title; ?>
" class="image" style="cursor: url(./css/zoomin.cur), pointer;" />
</a>
<p class="caption alpha">
<strong>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $title; ?>
</strong><br />
<em>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $desc; ?>

</em>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
                if ($link != '') {
                ?>

<br /><a class="link" href="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $link; ?>
" target="_blank">Bezoek</a> ...
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php } ?>

</p>
</li>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    }
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    }
?>

</ul>
 

28/12/2010 22:45:38
Quote Anchor link
Gebruik dan tenminste nog [code] en [/code].
 
Ceasar Feijen

Ceasar Feijen

28/12/2010 23:15:32
Quote Anchor link
why ?
de html code heeft niets te maken met het probleem
 
Kees Schepers

kees Schepers

28/12/2010 23:27:13
Quote Anchor link
Ceasar Feijen op 28/12/2010 20:56:59:
Helaas werkt dat niet.


Waarom werkt het niet? Toch niet omdat je het zo gekopieerd en geplakt hebt zeker? Want je moet het natuurlijk wel even vergelijken maar in de basis zou het moeten doen wat jij wilt.

Je wilt toch alle categorieën van alle bestanden?
 
Ceasar Feijen

Ceasar Feijen

28/12/2010 23:40:25
Quote Anchor link
alleen van de bestanden die in de $directory staan.
Sommige bestanden hebben dezelfde catagorie. Dus die moet maar een keer voorkomen in de <div id="portfolio_album"> en dat is dus niet zo helaas. de DISTINCT of de WHERE IN werken niet

Jouw vb geeft deze foutmelding
Warning: implode(): Invalid arguments passed in D:\Apache\htdocs\js\cms\modules\gallery3.php on line 58 SELECT DISTINCT catagorie FROM photo_files WHERE file IN("";


Toevoeging op 29/12/2010 12:41:10:

@bump

Iemand nog enig idee ?
Gewijzigd op 28/12/2010 23:54:26 door Ceasar Feijen
 
Ceasar Feijen

Ceasar Feijen

30/12/2010 00:39:09
Quote Anchor link
Okay,
Heb in ieder geval een goed reultaat nu en het werkt. Hier de verbetering

<ul id="filter">
<li>Filter op:</li>
<li class="current"><a href="#">Alles</a></li>
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
<?php
    $cats
= Array();
     foreach ($files as $key => $file)  #sorted all files
        {
        $pad = $albumpath.rawurlencode($file);

            $sql = 'SELECT catagorie FROM ' . $mysql_table_prefix . 'photo_files
                          WHERE file IN("'
.mysql_real_escape_string(str_replace('//','/',str_replace('./images/','',$pad))).'");';
            mysql_query($sql) or die( mysql_error() );

            $result = mysql_query($sql);
            while($row = mysql_fetch_assoc($result)){
                if ($row['catagorie'] != '') {
                    if(!in_array($row['catagorie'],$cats))
                        echo '<li><a href="#">' . $row['catagorie']. '</a></li>';
                        $cats[] = $row['catagorie'];
                }
              }
            }

     ?>

</ul>

Hier het script in actie
http://www.content-management-systeem.info/gallery3.html
Gewijzigd op 30/12/2010 17:15:14 door Ceasar Feijen
 



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.