Как я могу GROUP BY или DISTINCT внутри массива? - PullRequest
1 голос
/ 16 декабря 2010

Я искал все выше и ниже и не могу найти аналогичную проблему с тем, что у меня есть.

Я новичок, поэтому, пожалуйста, прости мою неуклюжую структуру запросов.

Я пытаюсь (прикрепил скриншот ниже вывода):

  • Запрос к таблице фотографий , чтобы получить идентификатор на основе идентификатора категории, а также начать, ограничить из-за нумерации страниц.
  • Запрос таблицы тегов photos на основе идентификатора фотографии, который я только что получил из первого запроса.

Но моя проблема в том, что я не могу сгруппировать теги, некоторые фотографии имеют одинаковое имя тега. И вывод просто показывает все теги для каждой фотографии. Я хочу, чтобы ресторан показывался только один раз и т.д ...

<?php
  // Get the file ideez and dont go beyond pagination start,limit eg:30,10       
$queryFile = "SELECT id FROM $tableName WHERE cat_id=".$fileID."  LIMIT $start, $limit";
$resultFile = mysql_query($queryFile);

while ($rowFile = mysql_fetch_array($resultFile)) { 
    // Get the tag names based on the file ideez retrived from the above query   
    $queryTagged = "SELECT tag_name FROM photoTagged WHERE file_id=".$rowFile['id']." GROUP BY tag_name";
    $resultTagged = mysql_query($queryTagged) or die(mysql_error()); 
    while ($rowTagged = mysql_fetch_array($resultTagged)) { 
        $tagged = $rowTagged['tag_name'];
        ?>
        <li><a href="#"><?php echo $tagged; ?></li>
<?php }} ?>

вышеупомянутый запрос производит:

бар, капучино, кофе, кофемашина, ресторан, бар, капучино, кофе, кофемашина, ресторан, бар, кофе, ресторан, бар, кофе, кофемашина ресторан, бар, каппучино, кофе, ресторан

мне нужно показать:

бар, капучино, кофе, кофемашина, ресторан

Если бы кто-нибудь мог помочь, я был бы очень признателен.

Заранее спасибо.

John


Мой новый код

<?php
  // Get the file ideez and dont go beyond pagination start,limit eg:30,10       
$queryFile = "SELECT id FROM $tableName WHERE cat_id=".$fileID."  LIMIT $start, $limit";
$resultFile = mysql_query($queryFile);

while ($rowFile = mysql_fetch_array($resultFile)) { 
    // Get the tag names based on the file ideez retrived from the above query   
    $queryTagged = "SELECT DISTINCT tag_name FROM photoTagged WHERE file_id=".$rowFile['id'];
    $resultTagged = mysql_query($queryTagged) or die(mysql_error()); 
    $rowTagged = mysql_fetch_array($resultTagged);
    $tagged = $rowTagged['tag_name'];

    ?>
    <li><a href="#"><?php echo $tagged; ?></li>
<?php } ?> 

Теперь я понимаю: (Так я близко, не так ли?)

----------
cappucino
restaurant
bar
coffee machine
restaurant
coffee

coffee





restaurant
restaurant
restaurant
coffee
coffee
restaurant
restaurant
coffee machine
restaurant
coffee

Интересно, пространства это что-то? я получил это от копирования и вставки ...

Буду признателен за любую дополнительную помощь: -)

Ответы [ 4 ]

2 голосов
/ 16 декабря 2010

Сначала вы должны выполнить соединение между вашими фотографиями и таблицей тегов, а затем выбрать отдельные теги.

Я считаю, что этот запрос позволит базе данных выполнить всю работу за вас:

SELECT DISTINCT tag_name
FROM (SELECT file_id FROM $tableName WHERE cat_id=$fileID LIMIT $start, $limit) t1
LEFT JOIN photoTagged ON t1.id = photoTagged.file_id

Вы также можете отсортировать теги в базе данных (ORDER BY tag_name).

Сам не пробовал, так что, возможно, синтаксис немного нарушен.Но идея должна работать.

1 голос
/ 16 декабря 2010

Different не работает, если вы получаете только одну запись за раз, поэтому поместите данные в массив PHP, а затем используйте array_unique, что является PHP-способом сделать различимым

   <?php 
        // Get the file ideez and dont go beyond pagination start,limit eg:30,10        

        $queryFile = "SELECT id FROM $tableName WHERE cat_id=".$fileID."  LIMIT $start, $limit"; 
        $resultFile = mysql_query($queryFile); 
        while ($rowFile = mysql_fetch_array($resultFile)) {  

        // Get the tag names based on the file ideez retrived from the above query    

        $queryTagged = "SELECT tag_name FROM photoTagged WHERE file_id=".$rowFile['id']; 
        $resultTagged = mysql_query($queryTagged) or die(mysql_error());  
        $rowTagged = mysql_fetch_array($resultTagged) 
        $tagged[] = $rowTagged['tag_name']; 
    }
// Let PHP do the work.
     $tagged=array_unique($tagged);
    while (list(,$val) = each($tagged)) {
        echo "<li><a href="#">$val</li> 
     }
      ?> 
0 голосов
/ 16 декабря 2010

вам нужно выполнить подзапрос, чтобы избежать проблем с нумерацией фотографий. Если вы хотите, чтобы выбранные теги были подмножеством фотографий, найденных в вашем первом запросе, то вам нужно будет сделать следующее.

<?php 
   $queryTagged = "SELECT TAG.tag_name, count(TAG.tag_name) AS num FROM photoTagged as TAG JOIN (SELECT id FROM $tableName WHERE cat_id=$fileID LIMIT $start, $limit) as PHOTO ON (PHOTO.id = TAG.file_id) GROUP BY TAG.tag_name"; 
   $resultTagged = mysql_query($queryTagged) or die(mysql_error());  

   while ($tagged = mysql_fetch_assoc($resultTagged)) {
      echo "<li id="'.$tagged['TAG.tag_name'].'"><a href="#">".$tagged['TAG.tag_name']." (".$tagged['TAG.num'].")</li>";
   }
?>

Таким образом, у вас будет два запроса для поиска фотографий и один для поиска тегов для фотографий на этой странице. Технически это занимает немного больше времени, так как MySQL должен загрузить запрос во временную таблицу, но он должен работать нормально.

0 голосов
/ 16 декабря 2010

SELECT DISTINCT tag_name FROM photoTagged WHERE file_id=".$rowFile['id']?

...