Compare data
Ik ben bezig om data te vergelijken allen het moet iets strakker
ik heb het volgde:
1 tabel met titles
1 tabel met links en naam aan de link
Nu wil ik kijken welke van de titels over een komen met links en die in een tabel match_links zetten
Nu heb ik het volgde
Code (php)
1
2
3
4
2
3
4
<?php
$sql = 'SELECT * FROM links WHERE title like "%'.$row["titleName"].'%" OR `title` LIKE "'.$row["titleName"].'%" OR `title` LIKE "%'.$row["titleName"].'" AND `match` = "0" ' ;
?>
$sql = 'SELECT * FROM links WHERE title like "%'.$row["titleName"].'%" OR `title` LIKE "'.$row["titleName"].'%" OR `title` LIKE "%'.$row["titleName"].'" AND `match` = "0" ' ;
?>
Allen zo vang ik dus best vaak shit mee die niet het zelfde is
Mijn vraga is dus is er een beter manier om data te vergelijken dan met % %
Gewijzigd op 26/09/2013 11:56:32 door Peter de Beer
a OR b OR c AND d
betekent
a OR b OR (c AND d)
Ongetwijfeld bedoel je
(a OR b OR c) AND d
Jij krijgt dus veel records waarbij match gelijk welke waarde heeft.
Die haakjes moet je sowieso gebruiken in je SQL string.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
SELECT
*
FROM
links_forum
WHERE
(title like '%Ali%'
OR `title` LIKE 'Ali%'
OR `title` LIKE '%Ali')
AND `match` = '0';
?>
SELECT
*
FROM
links_forum
WHERE
(title like '%Ali%'
OR `title` LIKE 'Ali%'
OR `title` LIKE '%Ali')
AND `match` = '0';
?>
Ik krijg zo veel shit mee die niet oke is
Dus ik wil veel strakker zoeken
De query die je hier geeft, daar krijg je toch enkel titels waar 'ali' in in voorkomt, nee?
Nu voer ik het volgde uit en ik krijg:
Hot.in.Cleveland.S04E13.Its.Alive.WEBRip.x264.AAC-NoGRP
Top Gear Australia COMPLETE S 1-2-3-4 avi
Californication 01-02-03-04 DVDRips 05 06 HDTV
Dada Life - Dada Land-SAT-06-01-2013-TALiON
Danny Howard - The Essential Selection-SAT-06-21-2013-TALiON
je ziet over al komt het woord ali in voor maar dat zoek ik dus niet
ik zoek dus eigenlijk het woord maar het moet altijd los voor komen in de zin dus niet een deel zijn van een ander woord
Gewijzigd op 26/09/2013 14:08:04 door Peter de Beer
Dus, bij jouw fetch haal je $row['titel'] eerst door deze functie die ik net gemaakt heb.
Als die FALSE teruggeeft, is de match gevonden binnen een woord; niet als apart woord.
dus iets als
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
while($row = mysql_fetch_assoc($res)) {
$wordpos = wordpos($row['titel'], 'Ali');
if($wordpos === false) {
continue; // dan wordt de iteratie overgeslagen
}
echo ' ... ';
}
?>
while($row = mysql_fetch_assoc($res)) {
$wordpos = wordpos($row['titel'], 'Ali');
if($wordpos === false) {
continue; // dan wordt de iteratie overgeslagen
}
echo ' ... ';
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
$needle = 'Ali';
$results = array(
'Hot.in.Cleveland.S04E13.Its.Alive.WEBRip.x264.AAC-NoGRP', // lijn 0
'Top Gear Australia COMPLETE S 1-2-3-4 avi', // lijn 1
'C. ali fornication 01-02-03-04 DVDRips 05 06 HDTV', // ...
'Dada Life - Dada Land-SAT-06-01-2013-TALiON',
'Danny Howard - The Essential Selection-SAT-06-21-2013-TALiON',
);
foreach ($results as $key=>$item) {
$wordpos = wordpos($item, $needle);
if ($wordpos !== false) {
echo 'lijn ' . $key . ' (nul based!) bevat het woord "' . $needle . '"<br>';
}
}
// Vergelijk dit met strpos. Maar dan met wat extra's
// mixed wordpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
function wordpos($haystack, $needle, $offset = 0) {
$ignoreCharacters = array(' ', ',', '.', ';', "'", '"', '-'); // vul gerust aan. Dit zijn karakters die mogen voorkomen net voor en net na het woord; en toch blijft het een woord.
$pointer = 0;
// merk op: een woord kan meermaals voorkomen. We moeten dit blijven testen voor alle resultaten van str(i)pos
do {
// als beide true geven, is het ding een woord.
$beforeOkay = false;
$afterOkay = false;
// start en stop index van waar (in de haystack) de needle voorkomt.
$start = stripos($haystack, $needle, $pointer); // stripos is case-insensitive. ALs je dat niet wil, maak er strpos van
$end = $start + strlen($needle) - 1;
$pointer = $start + 1; // bij de volgende iteratie gaan we beginnen zoeken 1 karakter verder dan de start van deze $start
if($start === false) {
break; // de needle komt helemaal niet voor in de haystack
}
if($start === 0) {
// De haystack begint met needle. Dat mag.
$beforeOkay = true;
}
//echo $end .' '. strlen($haystack) .'<br>';
if ($end +1 === strlen($haystack)) {
// De haystack eindigt met needle. Dat mag.
$afterOkay = true;
}
// zien naar de karakters die komen net voor en net na de needle
if ($beforeOkay == false && in_array($haystack{$start - 1}, $ignoreCharacters)) {
$beforeOkay = true;
}
if ($afterOkay == false && in_array($haystack{$end + 1}, $ignoreCharacters)) {
$afterOkay = true;
}
} while( ! ($beforeOkay && $afterOkay) );
if ($beforeOkay && $afterOkay) {
return $start;
}
return false;
}
?>
$needle = 'Ali';
$results = array(
'Hot.in.Cleveland.S04E13.Its.Alive.WEBRip.x264.AAC-NoGRP', // lijn 0
'Top Gear Australia COMPLETE S 1-2-3-4 avi', // lijn 1
'C. ali fornication 01-02-03-04 DVDRips 05 06 HDTV', // ...
'Dada Life - Dada Land-SAT-06-01-2013-TALiON',
'Danny Howard - The Essential Selection-SAT-06-21-2013-TALiON',
);
foreach ($results as $key=>$item) {
$wordpos = wordpos($item, $needle);
if ($wordpos !== false) {
echo 'lijn ' . $key . ' (nul based!) bevat het woord "' . $needle . '"<br>';
}
}
// Vergelijk dit met strpos. Maar dan met wat extra's
// mixed wordpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
function wordpos($haystack, $needle, $offset = 0) {
$ignoreCharacters = array(' ', ',', '.', ';', "'", '"', '-'); // vul gerust aan. Dit zijn karakters die mogen voorkomen net voor en net na het woord; en toch blijft het een woord.
$pointer = 0;
// merk op: een woord kan meermaals voorkomen. We moeten dit blijven testen voor alle resultaten van str(i)pos
do {
// als beide true geven, is het ding een woord.
$beforeOkay = false;
$afterOkay = false;
// start en stop index van waar (in de haystack) de needle voorkomt.
$start = stripos($haystack, $needle, $pointer); // stripos is case-insensitive. ALs je dat niet wil, maak er strpos van
$end = $start + strlen($needle) - 1;
$pointer = $start + 1; // bij de volgende iteratie gaan we beginnen zoeken 1 karakter verder dan de start van deze $start
if($start === false) {
break; // de needle komt helemaal niet voor in de haystack
}
if($start === 0) {
// De haystack begint met needle. Dat mag.
$beforeOkay = true;
}
//echo $end .' '. strlen($haystack) .'<br>';
if ($end +1 === strlen($haystack)) {
// De haystack eindigt met needle. Dat mag.
$afterOkay = true;
}
// zien naar de karakters die komen net voor en net na de needle
if ($beforeOkay == false && in_array($haystack{$start - 1}, $ignoreCharacters)) {
$beforeOkay = true;
}
if ($afterOkay == false && in_array($haystack{$end + 1}, $ignoreCharacters)) {
$afterOkay = true;
}
} while( ! ($beforeOkay && $afterOkay) );
if ($beforeOkay && $afterOkay) {
return $start;
}
return false;
}
?>
Peter de Beer op 26/09/2013 13:26:41:
Dit is overigens ook een beetje onzinnig. De tweede en derde LIKE voorwaarde leveren geen enkele match op die de eerste niet al oplevert. De tweede en derde kan je dus gewoon weglaten.
Vervolgens kan je oplossing overigens heel erg simpel zijn, namelijk door gebruik te maken van reguliere expressies in je query:
[[:<:]] en [[:>:]] zijn 'word boundaries'. Als het woord 'ali' gevonden wordt in de title dan wordt het record geselecteerd, anders niet.
Meer info over REGEXP in mysql: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
Hoewel Erwin ook een mooie oplossing heeft, zou ik in dit geval voor een full text search gaan.
Gewijzigd op 26/09/2013 18:05:45 door Ger van Steenderen
ten eerste bedankt voor jullie reactie ik denk zelf ook dat filterteren met sql slimmer is dan in php (vandaar ook dat ik het in "Databases & SQL" heb gezet )
Nu regexp idd een goed idee was er gister zelf ook gevonden had allen niet de juiste code. Allen ik blijf resultaten vinden die niet oke zijn
Nu heb ik een volgde idee ik heb een lijst met woorden die aan geven dat het gaat om een goede title
"cam" "ts" "divx" "mkv" "xvid" "dvd" "dvdr" "dvdrip" "brrip" "br2dvd" "r5" "r6" "x264" "ts2dvd" "dvd5" "dvd9" "720p" "1080p"
En dan wil ik zoeken op de title moet er in zitten en minstens 1 van deze key words
Toevoeging op 27/09/2013 13:37:27:
Ik heb nu het volgde
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
SELECT
title
FROM
links_forum
WHERE
title REGEXP '[[:<:]]The grey[[:>:]].*[[:<:]](cam|ts|divx|mkv|xvid|dvd|dvdr|dvdrip|brrip|br2dvd|r5|r6|x264|ts2dvd|dvd5|dvd9|720p|1080p)[[:>:]]';
?>
SELECT
title
FROM
links_forum
WHERE
title REGEXP '[[:<:]]The grey[[:>:]].*[[:<:]](cam|ts|divx|mkv|xvid|dvd|dvdr|dvdrip|brrip|br2dvd|r5|r6|x264|ts2dvd|dvd5|dvd9|720p|1080p)[[:>:]]';
?>
Probleem is dat deze gewoon super traag is al snel 2,5 min weet iemand hoe ik dit sneller kan maken