- Home
- Categorie
- Coding e Sistemistica
- PHP
- aiuto select
-
CORRETTO:
Ci provo anch'io... c'è in ballo una pizza...
Provata e funzionante,
per Mysql:SELECT * FROM ( SELECT A2.* FROM (SELECT ID FROM ARTICOLI WHERE ARTICOLI.visibile="si" ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2 WHERE A1.ID=A2.ID ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, MAX(id) AS MAX_ID FROM FOTO GROUP BY ID_ARTICOLO) B1, FOTO B2 WHERE B1.MAX_ID=B2.ID ) B ON A.ID=B.ID_ARTICOLO
per MsAccess:
SELECT * FROM ( SELECT A2.* FROM (SELECT TOP 3 ID FROM ARTICOLI WHERE ARTICOLI.visibile="si" ORDER BY DATA DESC) A1, ARTICOLI A2 WHERE A1.ID=A2.ID ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, MAX(id) AS MAX_ID FROM FOTO GROUP BY ID_ARTICOLO) B1, FOTO B2 WHERE B1.MAX_ID=B2.ID ) B ON A.ID=B.ID_ARTICOLO
Ciao e alla prossima
-
:():
-
mi son dimenticato di indicare qual è la modifica.... "ON A.ID=B.ID_ARTICOLO" al posto di "WHERE A.ID=B.ID_ARTICOLO"
-
Ciao OsteriaORistorante!
ho scritto:
SELECT * FROM (
SELECT A2.* FROM
(SELECT ID
FROM ARTICOLI
WHERE ARTICOLI.visibile="si"
ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2 ON A.ID=B.ID_ARTICOLO
) A LEFT JOIN (
SELECT B2.* FROM
(SELECT id_articolo, MAX(id) AS MAX_ID
FROM FOTO
GROUP BY ID_ARTICOLO) B1, FOTO B2
WHERE B1.MAX_ID=B2.ID
) B ON A.ID=B.ID_ARTICOLOma da errore:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON A.ID=B.ID_ARTICOLO ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, M' at line 6
ma tu hai provato con la mia query?
SELECT * FROM articoli LEFT OUTER JOIN foto ON articoli.id=foto.id_articolo WHERE visibile = 'si' GROUP BY id_articolo ORDER BY data DESC LIMIT 0, 3;
l'unico problema è che prende la prima foto e non l'ultima, colpa del GROUP BY se non sbaglio,
non si può dirgli in qualche modo "Ragruppa ma parti da in fondo"?
grazie mille a tutti
buona serata
-
@enricocarli said:
Ciao OsteriaORistorante!
[...]
ma da errore:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON A.ID=B.ID_ARTICOLO ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, M' at line 6
[...]Vabbè... che dire... eeehhhhh... non tutte le ciambelle riescono col buco....
Prova questo...
[PHP]
<?php
require_once'connect.php';
// recupero i singoli id_articolo delle foto
$query = "SELECT DISTINCT foto.id_articolo FROM foto ORDER BY id_articolo DESC";
$a = mysqli_query($conn, $query);
// metto ogni id_articolo in un array
while($r = mysqli_fetch_array($a)){
$array[] = $r[0];
}
echo '<pre>'; // DEBUG (eliminare)
var_dump($array); // DEBUG (eliminare)
echo '</pre>'; // DEBUG (eliminare)
$x = 0;
$i = 0;while($i <= count($array)-1){ // faccio un ciclo su tutti i valori dell'array. Il ciclo si ferma all'esaurimento dell'array o al recupero di 3 articoli (riga 29)...
$query2 = "SELECT foto.foto, h1, h2 FROM foto, articoli WHERE foto.id_articolo = '$array*' AND articoli.id = '$array*' AND articoli.visibile = 'si' ORDER BY foto.id DESC LIMIT 1"; echo $query2 . '<br />'; // DEBUG (eliminare) $result = mysqli_query($conn, $query2); $i++; // passo al valore successivo dell'array if(mysqli_num_rows($result) == 0) continue; // se con l'id_articolo non c'è un articolo "visibile" riprendo il ciclo da capo altrimenti proseguo... $x++; //... inserendo il primo articolo e aumentando il contatore while($row = mysqli_fetch_array($result)){ echo "<h1>Articolo $x </h1>"; // DEBUG (eliminare) echo $row['foto'] . '<br />'; echo $row['h1'] . ' ' . $row['h2'] . '<br />'; } if($x == 3) break; // quando il contatore degli articoli recuperati arriva a 3 mi fermo
}
?>
[/PHP]
Tonno e cipolla... grazie.
-
Ciao Enrico,
tonno e cipolla non mi interessano... ma giusto per verifica, mi sembra che la query che hai eseguito tu rispetto a quella che ti ho indicato io, è diversa nella parte evidenziata..... mi sbaglio?quella da me indicata:
SELECT * FROM (
SELECT A2.* FROM
(SELECT ID
FROM ARTICOLI
WHERE ARTICOLI.visibile="si"
ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2** WHERE A1.ID=A2.ID**
) A LEFT JOIN (
SELECT B2.* FROM
(SELECT id_articolo, MAX(id) AS MAX_ID
FROM FOTO
GROUP BY ID_ARTICOLO) B1, FOTO B2
WHERE B1.MAX_ID=B2.ID
) B ON A.ID=B.ID_ARTICOLOQuella da te eseguita:
SELECT * FROM (
SELECT A2.* FROM
(SELECT ID
FROM ARTICOLI
WHERE ARTICOLI.visibile="si"
ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2** ON A.ID=B.ID_ARTICOLO**
) A LEFT JOIN (
SELECT B2.* FROM
(SELECT id_articolo, MAX(id) AS MAX_ID
FROM FOTO
GROUP BY ID_ARTICOLO) B1, FOTO B2
WHERE B1.MAX_ID=B2.ID
) B ON A.ID=B.ID_ARTICOLOriprova, sarai più fortunato.... e ahimè.. Oslino più sfortunato
Ciaue
-
cheddire...
molto bravi tutti e 2, complimenti davvero...
se posso fare delle considerazioni, da principiante profano e impedito di php,
è veramente interessante come con una query si possano incrociare dati e manipolarli così,
parlo della query di OsteriaORistorante, che per quello che ne so io è veramente complessa...
però sinceramente non ho capito come funziona, e non ho capito il discorso degli alias; me li puoi spiegare?
Anche la soluzione di Oslino fa quello che deve fare è capisco a spanne come funziona, bravo Oslino!
Grazie a tutti e 2 per la pazienza e il tempo dedicatomi,
se capito a Milano o Rimini o capitate voi a Vicenza ve la offro la pizza :D:D:D:D:D
Un ultima domanda... ma secondo voi tra le 2 qual'è la soluzione migliore?
grazie ancora e buonanotte
-
@enricocarli said:
Un ultima domanda... ma secondo voi tra le 2 qual'è la soluzione migliore?
Che domande... la migliore è sempre quella che fa la stessa cosa con minor codice (e sfruttando le caratteristiche intrinseche del linguaggio).
Ne guadagna anche la velocità di esecuzione e quindi la performance generale.
-
annn...
ok capisco!e come faccio a misurare le performance?
-
@enricocarli said:
e come faccio a misurare le performance?
Non lo so come si potrebbe fare ma probabilmente non avrebbe neanche senso. Si parla di frazioni del millesimo di secondo impercettibili. Iniziano a diventare importanti e a vedersi rallentamenti quando si hanno migliaia di visitatori nello stesso momento.