---
title: "Dubletter, GROUP BY / ORDER BY"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/173877-dubletter-group-by-order-by"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "MickeA.com"
published: "2008-09-05T17:52:51.000Z"
updated: "2008-10-29T17:03:09.000Z"
replies: 4
views: 640
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/173877-dubletter-group-by-order-by"
---

# Dubletter, GROUP BY / ORDER BY

## #1 — MickeA.com, 2008-09-05T17:52Z

Hej!

Håller på med ett system där det finns ett antal texter på olika språk.
Det funkar så att personer kan logga in, välja en text och sedan översätta den.

Har gjort så att varje text sparas i en ny version varje gång någon är inne och ändrar i en text, för att vi ska kunna hålla lite koll på vad som översätts och hur det sett ut tidigare.

Jag har tre tabeller:

```
[b]document_page[/b]
page_id, INT
page_name, VARCHAR

[b]document_name[/b]
doc_id, INT
doc_parent, INT (kopplas till page_id i tabellen ovan)
doc_name, VARCHAR

[b]document_content[/b]
cont_id, INT
cont_parentid, INT (kopplattill doc_id i tabellen ovan)
cont_language, INT (koppat till en tabell med olika språk)
cont_text, TEXT
cont_updated, UNIX_TIMESTAMP
cont_status, INT
```

På sidan där alla texter visas, har jag problem med att få bort dubletterna.
Finns det mer än en version av texten på valt språk, visas båda.
Har testat med GROUP BY, men då visas den som är skapad först och inte den senaste.

Jag vill endast visa den post från *document_content* som är editerad senast.

Har gjort såhär:

```
SELECT 
a.doc_name, a.doc_desc, 
b.cont_id, b.cont_updated, b.cont_updatedby, 
(SELECT user_firstname FROM user WHERE user_id = b.cont_updatedby) AS firstname, 
(SELECT user_lastname FROM user WHERE user_id = b.cont_updatedby) AS lastname 
FROM document_name a 
INNER JOIN 
document_content b 
ON a.doc_id = b.cont_parentid 
WHERE a.doc_parent = <doc_parent>
AND b.cont_language = <lang_id>
ORDER BY a.doc_order ASC, b.cont_updated ASC
```

Har kört fast lite och behöver lite tips på hur jag ska lösa det här.
DBMS är MySQL.

Tack!

Permalänk: https://www.webforum.nu/p/173877

## #2 — Peter S, 2008-09-05T18:14Z

Sortera på datum så att den senaste hamnar "överst" och använda LIMIT för att begränsa urvalet till en rad, borde väl fungera?

Permalänk: https://www.webforum.nu/p/2136923

## #3 — LarsG, 2008-09-05T18:50Z

```
SELECT 
a.doc_name, a.doc_desc, 
b.cont_id, b.cont_updated, b.cont_updatedby, 
(SELECT user_firstname FROM user WHERE user_id = b.cont_updatedby) AS firstname, 
(SELECT user_lastname FROM user WHERE user_id = b.cont_updatedby) AS lastname 
FROM document_name a 
INNER JOIN 
document_content b 
ON a.doc_id = b.cont_parentid 
WHERE a.doc_parent = <doc_parent>
AND b.cont_language = <lang_id>
and b.cont_updated =
   (select max(cont_updated)
      from document_content dc
     where b.cont_parentid = dc.cont_parentid
       and dc.cont_language = <lang_id>)
ORDER BY a.doc_order ASC, b.cont_updated ASC
```

Permalänk: https://www.webforum.nu/p/2136927

## #4 — MickeA.com, 2008-09-05T19:24Z

Fungerar fint, tack!

Permalänk: https://www.webforum.nu/p/2136933

## #5 — MickeA.com, 2008-10-29T17:03Z

> **LarsG skrev:**
>
> ```
> SELECT 
> a.doc_name, a.doc_desc, 
> b.cont_id, b.cont_updated, b.cont_updatedby, 
> (SELECT user_firstname FROM user WHERE user_id = b.cont_updatedby) AS firstname, 
> (SELECT user_lastname FROM user WHERE user_id = b.cont_updatedby) AS lastname 
> FROM document_name a 
> INNER JOIN 
> document_content b 
> ON a.doc_id = b.cont_parentid 
> WHERE a.doc_parent = <doc_parent>
> AND b.cont_language = <lang_id>
> and b.cont_updated =
>    (select max(cont_updated)
>       from document_content dc
>      where b.cont_parentid = dc.cont_parentid
>        and dc.cont_language = <lang_id>)
> ORDER BY a.doc_order ASC, b.cont_updated ASC
> ```

Det där fungerade väldigt bra, men behöver modifiera den något.
Jag ska nu skriva ut en totalöversikt på alla sidor, där alla språk ska synas, 
se min bifogade bild så förstår ni hur jag menar.

Hur ändrar jag frågan ovan, så att den hämtar den senaste posten från *document_content*, på ett språk i taget?

Har gjort såhär:

```
$query = "SELECT "
	."a.page_id, a.page_name, "
	."b.doc_id, b.doc_name "
	."FROM "
	."document_page a INNER JOIN document_name b "
	."ON a.page_id = b.doc_parent "
	."WHERE a.page_parent = 3 "
	."ORDER BY a.page_order ASC, b.doc_order ASC";

$result = mysql_query($query) or die((DEBUG ? "<h2>An error occurred</h2>\n<p>" . mysql_error() . "<br />\n" . $query . "</p>\n" : "<p>An error has occurred, please contact site admin.</p>\n"));
if(!(mysql_num_rows($result) == false)){
	$current_page = 0;
	$y = 1;
	while($res = mysql_fetch_assoc($result)){
		if(!($current_page == $res['page_id'])){
			if(!$current_page == 0){
				$table_content .= "</div>\n";
			}
			$table_content .= "<h2>Section " . $y . "</h2>\n"
					 ."<div class=\"table_translation do_clearfix\">\n"
					 ."<div class=\"holder do_clearfix\">\n"
					 ."<p class=\"header\">Template</p>\n"
					 ."<p class=\"header\">English</p>\n"
					 ."<p class=\"header\">Swedish</p>\n"
					 ."<p class=\"header\">Finnish</p>\n"
					 ."<p class=\"header\">German</p>\n"
					 ."<p class=\"header\">Polish</p>\n"
					 ."<p class=\"header\">Hungarian</p>\n"
					 ."<p class=\"header\">Portuguese</p>\n"
					 ."<p class=\"header\">Russian</p>\n"
					 ."</div>\n\n";
		}

		$table_content .= "<div class=\"holder do_clearfix\">\n"
						 ."<p class=\"header\">Text " . $y . "</p>\n";
		$query = "SELECT "
			."a.cont_id, a.cont_updated, a.cont_status, a.cont_minor, a.cont_minor_datetime, a.cont_uploaded, "
			."b.lang_id, b.lang_name, "
			."(SELECT user_firstname FROM user WHERE user_id = a.cont_updatedby) AS firstname, "
			."(SELECT user_lastname FROM user WHERE user_id = a.cont_updatedby) AS lastname "
			."FROM "
			."document_content a, "
			."document_lang b "
			."WHERE a.cont_parentid = " . $res['doc_id'] . " "
			."AND cont_status = 2 "
			."ORDER BY b.lang_order ASC";

		$content = mysql_query($query) or die((DEBUG ? "<h2>An error occurred</h2>\n<p>" . mysql_error() . "<br />\n" . $query . "</p>\n" : "<p>An error has occurred, please contact site admin.</p>\n"));
		if(!(mysql_num_rows($content) == false)){
			while($con = mysql_fetch_assoc($content)){
				$table_content .= "<p>" . $con['cont_id'] . "</p>\n";
			}
		}
		mysql_free_result($content);

		$table_content .= "</div>\n\n";
		$current_page = $res['page_id'];
		$y++;
	}
	$table_content .= "</div>\n";
}
mysql_free_result($result);
```

Min förhoppning är att istället kunna använda frågan i posten ovanför, istället för att behöva köra en till fråga vid varje "varv" av loopen.

Tacksam för alla tips och idéer jag kan få!

Bilagor:

- [dump.overview.gif](https://www.webforum.nu/a/19418.gif)

Permalänk: https://www.webforum.nu/p/2151438

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/173877-dubletter-group-by-order-by
