2016-01-24 13 views
14

duplizieren diese Tabelle: User_PostsCodeigniter 3.0 Abfrage Fehler

ID  | Upvotes | Downvotes | CAT | 
___________________________________ 
42134 | 5  |  3 | Blogs| 
------------------------------------ 
12342 | 7  |  1 | Blogs| 
------------------------------------- 
19344 | 6  |  2 | Blogs| 
------------------------------------ 

Ich brauche den Rang eines Artikels erhalten innerhalb seiner Kategorie. Daher wird ID: 19344 Rang 2 mit 4 Upvotes haben, hinter 12342 mit 6 Upvotes. Der Rang wird durch (upvotes-downvotes) in seiner Kategorie bestimmt.

Also schrieb ich diese MySQL-Abfrage.

SELECT rank FROM (SELECT *, @rownum:[email protected] + 1 AS rank 
FROM User_Posts where CAT= 'Blogs' order by 
(Upvotes-Downvotes) DESC) d, 
(SELECT @rownum:=0) t2 WHERE POST_ID = '19344' 

Returns mir (Rang = 2), wenn sie direkt in mysql laufen. Dies ist das richtige Ergebnis

aber wenn ich versuche, es zu bauen durch Query Builder den Code-Zünder bekomme ich die

$table = 'User_Posts'; 
$CAT= 'Blogs'; 
$POST_ID = '19344'; 

$sql = "SELECT rank FROM (SELECT *, @rownum:[email protected] + 1 AS 
rank FROM $table where CAT= ? 
order by (Upvotes-Downvotes) DESC) d, 
(SELECT @rownum:=0) t2 WHERE POST_ID= ?"; 

$query= $this->db->query($sql, array($CAT,$POST_ID))->row_array(); 

kehrt zu mir ein leeres Ergebnis: array (Rang =>);

also dann ist meine Frage ... aber warum?

Ich werde auch eine Antwort akzeptieren wird eine alternative Möglichkeit, diese Abfrage von Code-Zünder Query Builder ausführen, aber im Idealfall würde ich gerne wissen, warum dieses Ding gebrochen ist.

+0

Können Sie nicht die SQL zu 'SELECT (Upvotes - Downvotes) AS Rang FROM User_Posts WHERE CAT = 'Blogs' UND POST_ID = 19344;'? Scheint so, als ob es trivial wäre, in Query Builder von CI auch zu implementieren. – quickshiftin

+0

@quickshiftin Rang ist nicht die Anzahl der (upvotes-downvotes), aber es ist die Position des Elements in Bezug auf jedes andere Element in der gleichen Kategorie. – Edward

+0

Ok, wie berücksichtigst du Bindungen in (upvotes-downvotes) für eine bestimmte Kategorie? – quickshiftin

Antwort

4

ich ein ähnliches Problem in der Vergangenheit gehabt haben, stellt sich heraus, dass ich zuerst die Variable mit einer separaten Abfrage initialisiert hatte, ich bin nicht sicher, ob dies noch der Fall ist, sondern geben eine ohnehin versuchen.

//initialize the variable, before running the ranking query. 
$this->db->query('SELECT 0 INTO @rownum'); 
$query= $this->db->query($sql, array($CAT,$POST_ID))->row_array(); 
+0

Dies war die Lösung, die Sie die Variable initiieren müssen. Sehr geschätzt. – Edward

+2

@Edward ... aber das wusstest du schon! Sie haben es einfach an der falschen Stelle in Ihrer Anfrage getan. N.B. Wenn Sie es so machen, können Sie ', (SELECT @rownum: = 0) t2' aus Ihrer Anfrage entfernen. – Arth

2

Schreiben Sie eine gespeicherte Funktion, um die Abfrage auszuführen. Dann haben Codeigniter nur

query("SELECT PostRank(?,?)", $CAT, $POST_ID); 

Einschränkung tun: Da Sie nicht PREPARE innerhalb einer gespeicherten Funktion tun können, wird diese Funktion unbedingt spezifisch an einen Tisch, User_Posts.

5

Genau ich weiß nicht, warum Ihr Code nicht funktioniert. Ich habe eine andere Lösung geschrieben, die funktioniert. Probieren Sie den folgenden Code aus.

$select="FIND_IN_SET((upvote-downvote), (SELECT GROUP_CONCAT((upvote-downvote) ORDER BY (upvote-downvote) DESC) as total FROM (User_Posts))) as rank"; 
$this->db->select($select,FALSE); 
$this->db->from('(User_Posts)',FALSE); 
$this->db->where('ID',19344); 
$this->db->where('CAT','Blogs'); 
$query = $this->db->get(); 
1

Ich bin nicht ganz sicher, ob dies das Problem ist, aber ich würde @rownum in der Unterabfrage wird initialisiert:

SELECT rank 
    FROM (
    SELECT *, 
      @rownum:[email protected] + 1 AS rank 
     FROM $table 
     JOIN (SELECT @rownum := 0) init 
     WHERE CAT= ? 
    ORDER BY (Upvotes-Downvotes) DESC 
     ) d 
WHERE post_id = ? 

Ansonsten ich besorgt sein würde, dass @rownum nicht definiert ist (NULL) und bleibt so, während rank berechnet wird (NULL + 1 = NULL), nur danach den Wert von 0 zugewiesen. Somit wird rank als NULL zurückgegeben und Sie erhalten ['rank'=>].

dies wieder zum Laufen in einer konstanten Verbindung (direkt in MySQL) würden Sie dann das richtige Ergebnis als @rownum aus dem Wert 0 der vorherige Abfrage würde und rank korrekt berechnet werden beginnen würde.

Ich vermute, codeigniter startet eine neue Verbindung/Transaktion jedes Mal, wenn die Abfrage ausgeführt wird und @rownum beginnt jedes Mal bei NULL, geben ['rank'=>].