SQL Elegante Lösung gesucht

Schnipp

Lt. Commander
Registriert
Feb. 2004
Beiträge
1.141
Tach zusammen,

habe hier folgende Konstellation: ich bekomme Daten in einer Tabelle geliefert. Diese Daten werden in tabellarischer Form ausgegeben.

Nun sollen die Einträge, bei denen ein bestimmtes Merkmale (z.B. eine ID) gleich ist, als Doppler markiert werden.

Wie löse ich das am elegantesten? Da ich selbst keinen Zugriff auf das Einlesen der Daten in die Tabelle habe müsste ich eine Option haben, dies erst beim Zusammenstellen der Ansicht zu realisieren. Allerdings finde ich keine gute Lösung.

Habe schon mal an ein COUNT gedacht und wenn das Ergebnis größer 1 ist wird der Eintrag markiert ...

Gruß Schnipp
 
Was für eine Tabelle?
Das Statement kannst du nicht bearbeiten wenn ich das richtig verstanden habe, sondern nur das Ergebnis.
Was soll mit den Datensätzen passieren?
 
Du hast mehrere Möglichkeiten:

Per SQL ->

wie du schon sagtest per
Code:
having count(bla) > 1

per PHP ->

PHP:
<?PHP

$check_count = mysql_query("SELECT id FROM tabelle") or(mysql_error());
$ausgabe = mysql_num_rows($check_count);

//und dann deine Ausgabe darauf aufbauen ala 

if($ausgabe > 1) {
//ausgabe farbig
$id_color = '<span style="color:#FF0000;">'.$id.'</span>';
} else {
$id_color = $id;
}

//nun statt $id (ausgabe deiner mysql abfrage) $id_color nehmen.

?>

So würde ich das wohl machen, wenn was nicht korrekt ist bescheid geben.
 
Zuletzt bearbeitet:
Den Ansatz mit dem COUNT hatte ich ja auch im Kopf. Allerdings wie ich das genau in eine entsprechende Abfrag reinbringe weiß ich noch nicht wirklich.

Ich durchlaufe ja zum Erstellen der Tabellensicht schon die komplette TABLE bis EOF. Aber wie genau kann ich dabei noch die einzelnen Datensätze überprüfen?
 
Ich hab ja noch keine! Ich weiß ja gar nicht wie ich die Aufbauen sollte ...

Code:
<% DO WHILE NOT RS.EOF %>
<TABLE>
<TR>
  <TD><%=RS("wert1")%></td>
  ...

So einfach werden die einzelnen Felder aus der Tabelle ausgelesen und in die Ansicht gebracht.

Es ist vermutlich super simpel und ich steh mir gerade furchtbar auf dem Schlauch ... :rolleyes:

P.S.: Am einfachsten wäre es für mich, wenn direkt beim Einlesen der Daten z.B. ein Wert doppler in der Tabelle mit 0 oder 1 versehen würde, dann reichte mir eine einfache IF-Abfrage.
 
Zuletzt bearbeitet:
Code:
select id, count(*) As anzahl
from tabelle_X
group by id
having count(*) > 0;

Somit wird in [anzahl] die anzahl der Datensätze zurück geliefert.
 
Ok, also entweder komme ich mit der letzten Antwort nicht klar oder ich konnte meine Anfrage noch nicht klar genug formulieren - auf ein Neues. Ich versuche mal eine Tabelle zu abstrahieren:

ID | Name | Vorgang
------------------------------
1 | Name 1 | V0001
2 | Name 2 | V0002
...
17 | Name 17 | V0002

So, und dieser Eintrag mit der ID 17 soll mir dann in der Ausgabetabelle entsprechend markiert werden, weil er die gleiche Vorgangsnummer hat wie die ID 2.
 
Ok, ich bin gerade völlig verwirrt und finde einfach keinen Ansatz mehr dazu ... :freak:

Ich brauche aus der Tabelle example den Wert der Spalte vorgang und sobald diese Vorgangsnummer mehr wie einmal auftaucht sollen die entsprechenden Datensätze in der Spalte doppler mit 1 markiert werden.

Ich grübel nun darüber, ob es sinnvoller ist, diese Abfrage schon irgendwie beim Einlesen der Excel-Datei und dem Schreiben in die Datenbank zu machen oder doch erst nachher bei der Ausgabe. Würde lieber direkt beim Einlesen den Daten die Spalten entsprechend prüfen und ändern.

Vielleicht kann mir jemand zur Unterstützung einen möglichen Quellcode zeigen? Sobald ich den Ansatz habe komme ich hoffentlich wieder alleine klar.

Ich stell mich hier gerade an wie der erste Mensch ...:confused_alt:
 
Code:
select *, (select count(Vorgang) from Tabelle a where a.Vorgang=b.Vorgang) as doppler from Tabelle b;

Edit: Mit dem count wird eben die Anzahl der Vorkommen ausgegeben. Wenn nur 1 da ist, dann eben 1, wenn mehr, dann eben 2, 3, 4 oder mehr. Vielleicht reicht das auch schon.
 
Zuletzt bearbeitet:
Diesen Ansatz hatte ich auch schon, aber Du sprichst dort von 2 Tabellen A und B. Es gibt aber nur eine Tabelle!
 
Ich verwende hier Aliase. Ich hätte auch schreiben können Tabelle AS a und Tabelle AS b.
Es ist jeweils dieselbe Tabelle, nur in der where Klausel muss ich die beiden ja verbinden. Dazu benötige ich einen eindeutigen Namen, ich hab der Einfachheit halber a und b genommen.
 
Also ich würde die Daten in ein array schreiben und vor jedem neuen Eintrag überprüfen, ob die Vorgangs-ID schon existiert, wenn ja, eben beide "array-Zeilen" mit 1 markieren. Dann folgt die Ausgabe in html.

Oder hast du keinen Zugriff auf eine Programmiersprache und das ganze muss in sql passieren?
 
Also ich habe jetzt über folgende Abfrage zumindest schon mal alle betroffenen Vorgangsnummern vorliegen:

Code:
SELECT [vorgang] FROM [datenbank]
WHERE [vorgang] <> ''
GROUP BY [vorgang] HAVING Count([vorgang]) > 1

Aber wie verarbeite ich das jetzt am Besten weiter? Möchte nur den Wert der Spalte [doppler] von 0 auf 1 setzen lassen. Ich weiß, es sieht aus, als würde ich das erste Mal was in SQL machen. Aber vielleicht ist es auch das Alter ... ;)
 
über wie viele datensätze sprechen wir ?

sehe ich das richtig, dass du zu deinen normalen spalten zusätzlich noch eine spalte mit dem Wert doppler = 0 oder 1 haben willst?

Ich würd wohl schauen, dass auf der Spalte ID ein Index liegt und das folgendermaßen machen:

PHP:
select 
	t1.a,
	t1.b,
	t1.id,
	(select (count(*)-1) from table where id = t1.id group by id) as quantity
from 
	table t1
where 
	1

Damit hast du in der Spalte quantity drinstehen wie häufig die id bereits vergeben wurde und kannst mit php ganz easy mit 'quantity' > 0 gegenprüfen und alle Zeile mit mehrmals vergebenen ids farbig markieren.
 
So, komme jetzt erst wieder dazu mich um diese Sache zu kümmern.

Habe mir überlegt, ob es nicht auch einfach per vbs-Skript erledigt werden kann. Das dieses Skript einfach gestartet wird, wenn die Daten aus den Excel-Dateien eingelesen wurden, und die Doppler sucht und entsprechend markiert.
 
Ich hab grad heute was mit SQL Statements gemacht, da hab ich wieder was gelernt...
select *, (CASE WHEN (select count(Vorgang) from Tabelle a where a.Vorgang=b.Vorgang) as doppler from Tabelle b) > 1 THEN '1' ELSE '0' END;

Warum noch ein Skript, wenn du das auch mit deiner einfachen Abfrage gleich mit erledigen kannst.
 
Zurück
Oben