2016-06-09 10 views
1

ich ein Coldfusion-Neuling bin und ich versuchte, Duplikate aus der Ausgabe des Skripts zu entfernen unten mit dem Gruppe-Attribute in dem <cfoutput> -tag aber das macht irgendwie nicht:Wie konvertiert man eine Schleife in ein Array in ColdFusion, um Duplikate zu entfernen?

<cfoutput query="show_books" group="titleno"> 

Also habe ich versucht, Gruppenduplikate über SQL:

GROUP BY books.ean 

Aber leider funktioniert das auch nicht.

Also ich denke jetzt, ich muss die Schleife unten in ein Array oder eine Liste konvertieren, um die Ergebnisse der ersten Suche in ein Array/eine Liste zu schreiben, sortieren Sie, entfernen Sie dann die Duplikate und die endgültige Ausgabe von das Array/die Liste. Aber ich habe keine Ahnung, wie man das in ColdFusion macht. So wird jede Hilfe geschätzt!

Das Skript stammt von einer Website mit Büchern. Wenn Sie die Detailseite eines Buchs öffnen, sehen Sie am unteren Rand dieser Detailseite weitere Bücher desselben Autors. Das Problem ist, dass es mit nur einem Autor funktioniert. Auch mit zwei oder mehr Autoren, aber nur (und das ist der Kern), wenn sie nicht mehr als ein Buch zusammen geschrieben haben. So z.B. wir haben ein Team von drei Autoren, die zusammen vier verschiedene Bücher geschrieben haben, sehen wir 12 Bücher in der Ausgabe statt vier ... :-(

Hier ist der Code:

<cfloop query="title_data"> 

    <!-- query database --> 
    <cfquery name="show_books" datasource="#database#" dbtype="ODBC"> 
     select * from books, books_publisher, books_mapping 
     where books.ean <> '#ean#' AND 
     books_publisher.publisher_id = #title_data.publisher_id# AND 
     books_publisher.partner_id = books_mapping.adrno AND 
     books.titleno = books_mapping.titleno AND 
     (books.visibility = 1 OR books.visibility = 2 OR books.visibility = 20 OR books.visibility = 95 OR books.visibility = 102 OR books.visibility = 107) 
     order by books.title asc, books.ean asc 
    </cfquery> 

    <cfoutput query="show_books"> 

     <!-- load publisher --> 
     <cfquery name="show_mapped" dataSource="#database#" dbtype="ODBC"> 
      select * from books_mapping 
      WHERE titleno = #show_books.titleno# AND 
      (role = '1' OR role = '2') 
      order by books_mapping.ranking 
     </cfquery> 
     <cfset authorteam = #show_mapped.recordcount#> 

     <!-- show title data of books --> 
     <table> 
     <tr><td> 
       <a href="index.cfm?view=3&ean=#ean#"><img src="./covers/small/#cover#" class="shadow"></a> 
      </td> 
      <td> 
       <cfloop query="show_mapped"> 

        <cfquery name="show_publisher" dataSource="#database#" dbtype="ODBC"> 
        select * 
        from books_publisher 
        WHERE partner_id = #show_mapped.adrno# 
        </cfquery> 
        <cfloop query="show_publisher"> 
        <cfset authorteam = authorteam -1> 
        <a href="index.cfm?view=6&author_id=#publisher_id#" class="authors">#publisher_prename# #publisher_surname#</a> 
        <cfif authorteam neq '0'>|</cfif> 
        </cfloop> 
      </cfloop> 
      .... 
      </td> 
     </tr> 
     <tr><td align="right">#price_eur# EUR</td> 
      <td> ... 
       <a href="index.cfm?view=3&ean=#ean#" class="further_button">Details</a> 
      </td> 
     </tr> 
    </table> 
    </cfoutput> 

</cfloop> 

Auch wenn es ist eine andere Möglichkeit oder Workaround, um die doppelten Einträge in der Ausgabe zu entfernen, wäre es eine große Hilfe für mich.Ich bin offen für alle Arten von Vorschlägen, nur um es zum Laufen zu bringen

+0

(Bearbeiten) Ignorieren anderer Probleme für einen Moment A) Bitte bearbeiten Sie Ihren Beitrag, um die Beziehungen der drei (3) Tabellen zu beschreiben und ein kleines Datensample aufzunehmen. B) Welche Spalte (n) identifizieren den Autor? Es ist schwer zu sagen, da die Abfragen SELECT * statt einzelner Spaltennamen verwenden. – Leigh

+0

Ich vermute stark, dass die Abfrage und/oder die Filter entweder falsch oder weniger effizient sind, wie sie sein könnten. Durch die Bereitstellung eines * kleinen * Datensamples und einer Beschreibung der Tabellen können wir eine effizientere Abfrage vorschlagen. – Leigh

Antwort

0

Wenn Sie nicht den Primärschlüssel benötigen Werte, ändern Sie dies:

select * from books, books_publisher, books_mapping 

dazu:

select distinct justTheFieldsYouNeed 

Wenn Sie das tun, dann Ihre Abfrage halten, wie es ist und das Gruppenattribut von cfoutput verwenden, um Ihre Anzeige zu verwalten.

+0

Obwohl ein 'distinct' helfen könnte, könnte es auch ein größeres Problem maskieren, wenn die Abfrage falsch ist. Ich würde empfehlen, die Sql zuerst zu überprüfen, um festzustellen, ob die Joins sogar notwendig sind. – Leigh