0
votes

Comment traduire une requête pré-formatée Codeigniter en une requête Mysql originale (par exemple $ this-> db-> select ('table1. *, Table2. *, Table3. *'))

J'ai un site Web qui utilise un framework CodeIgniter et qui utilise presque la classe de requête préformatée de CodeIgniter dans chaque demande de traitement des données de la base de données créée par mon ancien collègue.

Un des exemples est comme ceci:

XXX

Je veux changer le résultat de cette requête, mais pour le comprendre, je dois d'abord le traduire en une requête MySQL originale. Tentative de faire ceci:

SELECT `barang`.*, `barang_keluar`.*, `barang_masuk`.*
FROM `barang` AS A
LEFT JOIN `barang_keluar` AS B ON A.id_barang = B.id_barang
LEFT JOIN `barang_masuk` AS C ON A.id_barang = C.id_barang
ORDER BY A.id_barang ASC, A.kode_barang ASC
WHERE A.status = 0

Mais j'ai eu cette erreur

1064 - Vous avez une erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'WHERE A.status = 0 LIMIT 0, 25' à la ligne 6

J'ai essayé de supprimer le WHERE A.status = 0 pour voir ce qui ne va pas dans mon code le j'ai eu cette erreur

1051 - Table inconnue 'barang'

Je pensais que le problème était dans la ligne SELECT barang. *, barang_keluar. *, barang_masuk. * , car je ne savais pas vraiment comment l'écrire dans un original MySQL formaté.

J'ai déjà cherché ce sujet et j'ai même essayé d'écrire la requête directement dans la barre de recherche mais je n'ai pas trouvé la bonne approche en fonction de mon cas. J'espère que quelqu'un pourra vous aider


2 commentaires

Avez-vous utilisé la pagination avec cette requête?


Pagination? Peut-être voulez-vous me donner une amélioration pour paginer le résultat que j'obtiens, mais mon point est de savoir comment écrire le script MySQL pur traduit à partir du constructeur de CodeIgniter.


3 Réponses :


1
votes

Si vous souhaitez consulter la chaîne de requête générée par le générateur de requêtes CI, vous pouvez enregistrer cette méthode $ this-> db-> last_query () qui donnera la dernière requête SQL sous forme de chaîne exécuté par lui.


0 commentaires

1
votes

Votre requête est presque correcte. Mais vous devrez le modifier le ordre avant . Parce que vous avez utilisé asc plus d'une fois, cela n'est pas non plus pris en charge par mysql. Vous devez modifier votre requête comme ci-dessous

    SELECT A.*, B.*, C.*
FROM barang AS A
LEFT JOIN barang_keluar AS B ON A.id_barang = B.id_barang
LEFT JOIN barang_masuk AS C ON A.id_barang = C.id_barang 
WHERE A.status = 0 ORDER BY A.id_barang, A.kode_barang ASC

Maintenant, confirmez que vous avez la table barang dans votre base de données et réessayez. Si vous rencontrez un autre problème SQL, répondez simplement avec votre capture d'écran de l'extrait de code ici.


3 commentaires

Regardez essayé ici mais curieusement, la table barang est introuvable. Découvrez ibb.co/WVzKx18


Vous devez remplacer -> SELECT barang. *, Barang_keluar. *, Barang_masuk. * Par SELECT A. *, B. *, C. *, car vous utilisez des alias


Ya ça peut être le problème. Vérifiez à nouveau mon commentaire. Je l'ai édité.



2
votes

Vous pouvez simplement imprimer votre requête, puis vous pouvez voir votre requête au format SQL d'origine.

function tampilkan_data(){
    $this->db->select('barang.*,barang_keluar.*,barang_masuk.*');
    $this->db->from('barang');
    $this->db->join('barang_keluar', 'barang.id_barang=barang_keluar.id_barang','left');
    $this->db->join('barang_masuk', 'barang.id_barang=barang_masuk.id_barang','left');
    $this->db->order_by('barang.id_barang','asc');
    $this->db->order_by('barang.kode_barang','asc');
    $this->db->where('barang.status','0');
    $query = $this->db->get()->result(); // notice that i have removed the return keyword
    echo $this->db->last_query(); // This will print your query directly on the screen.
}

Mais l'erreur que vous obtenez est -> Vous n'ont pas de table nommée barang. Assurez-vous que la table existe.

J'espère que cela vous aidera ...


5 commentaires

Eh bien merci, c'est ce que j'obtiens SELECT barang. *, Barang_keluar. *, Barang_masuk. * FROM (barang) LEFT JOIN barang_keluar ON barang.id_barang = barang_keluar.id_barang LEFT JOIN barang_masuk ON barang.id_barang = barang_masuk.id_barang WHERE barang.status = 0 ORDRE PAR barang.id_barang asc, barang.kode_barang asc . Je pense que ce n'est pas trop différent, sauf les crochets ..


Ok maintenant je l'ai. Vous devez remplacer -> SELECT barang . *, barang_keluar . *, barang_masuk . * Pour SELECT A . * , B . *, C . *, car vous utilisez des alias


Je pense que simplement faire SELECT * FROM ... va extraire tous les champs de toutes les tables jointes.


@DFriend Eh bien, c'est mon problème, je veux seulement tirer quelques colonnes sans utiliser Table. * ..


@Riosant Eh bien, echo $ this-> db-> last_query (); m'a sauvé, permettez-moi de modifier la requête .. merci