webForumDet fria alternativet

Dubletter, GROUP BY / ORDER BY

4 svar · 618 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 441 inlägg
#1

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!

Peter SMedlem sedan dec. 20025 483 inlägg
#2

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?

LarsGMedlem sedan dec. 200012 464 inlägg
#3
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
MickeA.comMedlem sedan feb. 20034 441 inlägg
#4

Fungerar fint, tack!

MickeA.comMedlem sedan feb. 20034 441 inlägg
#5

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å!

dump.overview.gif
138 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)